首页 > 学院 > 开发设计 > 正文

[51NOD] 1009 数字1的数量 [数学][详解]

2019-11-06 07:31:04
字体:
来源:转载
供稿:网友

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。 例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。 Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示例 5

题解

提供一组数据 输入127948输出99344 不是很好想

记n的长度为L,设f(x) 为小于x的包含1的个数 1. 长度小于L的 即求 f(10L) 利用数学归纳法可以得到 f(10k+1)=f(10k)⋅10+10k 那么不难求得该情况下的答案 2. 长度等于L的 该情况就有点复杂了 设g(x) 为第x位到个位的包含1的个数,记第x位的数字为Rx ,记第x位后面的数Cx=Rx−1⋅10x−2+Rx−2⋅10x−3+…+R1 那么当x<Lg(x)=⎧⎩⎨⎪⎪g(x−1)+Rx⋅f(10x−1)+10x−1,g(x−1)+Rx⋅f(10x−1)+Cx,g(x−1),Rx>1Rx=1Rx=0x=Lg(x)=⎧⎩⎨⎪⎪g(x−1)+(Rx−1)⋅f(10x−1)+10x−1,g(x−1)+(Rx−1)⋅f(10x−1)+Cx,g(x−1),Rx>1Rx=1Rx=0

我的代码有点乱

#include<cstdio>#include<cmath>int main(){ int n; int ans=0,t=1,res=0,add=0,tmp=0; scanf("%d",&n); while(n){ ans=ans+((n<10?-1:0)+n%10)*add+(n%10==1?res+1:0)+(n%10>1?t:0); tmp=add; add=add*10+t; res+=(n%10)*t; t*=10; n/=10; } PRintf("%d/n",ans+tmp); return 0;}
上一篇:萌萌哒的第二题

下一篇:书本整理

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表