给定一个十进制正整数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
,设
1. 长度小于
L
的
即求
利用数学归纳法可以得到
f(10k+1)=f(10k)⋅10+10k
那么不难求得该情况下的答案
2. 长度等于 L 的
该情况就有点复杂了
设
那么当 x<L 时
g(x)=⎧⎩⎨⎪⎪g(x−1)+Rx⋅f(10x−1)+10x−1,g(x−1)+Rx⋅f(10x−1)+Cx,g(x−1),Rx>1Rx=1Rx=0
当 x=L 时
g(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;
}