题目描述
给定一个数字 N,请你计算 1∼N 中一共出现了多少个数字 1。
例如,N=12 时,一共出现了 5 个数字 1,分别出现在 1,10,11,12 中。
输出格式
输出一个整数,表示 1 的个数。
样例
输入样例:
12
输出样例:
5
算法1
分析:这是⼀道数学问题。从第⼀位(个位)到最⾼位,设now为当前位的数字,lef为now左边的所
有数字构成的数字,right是now右边的所有数字构成的数字。只需要⼀次次累加对于当前位now来说
可能出现1的个数,然后把它们累加即可。a表示当前的个位为1,⼗位为10,百位为100类推。
对于now,有三种情况:
1.now == 0 : 那么 ans += lef * a; //因为now==0说明now位只有在lef从0~lef-1的时候会产⽣1,所以会产
⽣lef次,但是⼜因为右边会重复从0~999…出现a次
2.now == 1 : ans += lef * a + right + 1;//now = 1的时候就要⽐上⼀步多加⼀个当now为1的时候右边出现
0~right个数导致的now为1的次数
3.now >= 2 : ans += (lef + 1) * a;//now⼤于等于2就左边0~lef的时候会在now位置产⽣1,所以会产⽣lef
次,但是⼜因为右边会重复从0~999…出现a次
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,left=0,right=0,a=1,now=1,ans=0;
cin>>n;
while(n/a)
{
left=n/(a*10),now=n/a%10,right=n%a;
if(now==0) ans+=left*a;
else if(now==1)ans+=left*a+right+1;
else ans+=(left+1)*a;
a=a*10;
}
cout<<ans;
return 0;
}
yyds
牛啊,可惜我还是看不懂