两个测试点超时22
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int pd(int n)
{
int count=0;
int t;
while(n!=0)
{
t=n%10;
if(t==1)
count++;
n=n/10;
}
return count;
}
int main()
{
int n;
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=pd(i);
}
printf("%d\n",sum);
}
其实是个数学问题
now是当前数位的值
a为数位(10、100)
left、right分别是左右的数值
情况1:当now=0时,值为left*a
情况2:当now=1时,值为left*a+right+1
情况2:当now>=2时,值为(left+1)*a
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int left,right,now;
int ans=0;
int a=1;
while(n/a!=0)
{
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;
}
printf("%d\n",ans);
return 0;
}