这道题直接的思路就是暴力遍历,但是毫无疑问的是2^30这个量级一定会超时,但是我还是试了试结果咋样hhh
暴力遍历代码:
using namespace std;
#include<bits/stdc++.h>
int main()
{
int n,i,tmp,sum=0;
scanf("%d",&n);
int tmp2;
for(i=1;i<=n;i++){
tmp=i;
while(tmp>0){
tmp2=tmp%10;
tmp/=10;
if(tmp2 == 1) sum++;
}
}
printf("%d",sum);
return 0;
}
既然暴力遍历解决不了问题,就一定要想想办法,这道题明显是有规律的,所以需要发现规律,参考题解后,写出了AC的代码,这里left,now,right的值的获得也是不好实现的,具体可见代码。
AC代码:
using namespace std;
#include<bits/stdc++.h>
int main()
{
int n,i=1,sum=0;
scanf("%d",&n);
int left,now,right;
while(n/i !=0)
{
left=n/(i*10);
now=n/i%10;
right=n%i;
if(now == 0) sum+=left*i;
else if(now == 1) sum+=left*i+right+1;
else sum+=(left+1)*i;
i*=10;
}
printf("%d",sum);
return 0;
}