第一次运行时有个一分的测试点超时了。。。
压缩了一点时间,不过感觉没什么区别,32的数就算32*32也耗不了多久
然后就过了
不过又把原先没改的再提交一遍也过了。。。
之后又提交了三四次也都过了,搞不懂。。。
这题找规律,0~9 有1*1个
0~99 有2*10个
0~999 有3*100个
0~9999 有4*1000个
然后根据数的左边第一位是大于1还是等于1分两类计算
从高位算到十位
最后带上个位
例如:34122
万位:计算0~29999 有3*4*1000+10000
千位:计算30000~33999 有4*3*100+1000
百位:计算34000~34099 有1*2*10
计算34100~34122 有123(百位是1有100~122共123个)
十位:计算34100~34119 有2*1*1+10
个位:计算34120~34122 有1
#include<stdio.h>
#define MAX 50
int main(){
int a[MAX]={0},temp[MAX]={0};
int n=0;
char c;
temp[0]=1;
c=getchar();
while(c!='\n'){
a[n]=(int)(c-'0');
temp[n+1]=temp[n]*10;//temp[0]=1;temp[1]=10;temp[2]=100
n++;
c=getchar();
}
//printf("%d",i);
int j=n;//数的位数
int sum=0;//记录个数
for(int i=0;i<n-1;i++){//只计算到十位,个位单独计算
sum+=a[i]*(j-1)*temp[j-2];//[0~a[i]*10^(j-i-1))范围内1的个数sum+=a[i]*(j-1)*10^(j-2)
if(a[i]>1){
sum+=temp[j-1];
}
else if(a[i]==1){
int temp2=0;
for(int k=i+1;k<n;k++){
temp2=temp2*10+a[k];
}
sum+=(temp2+1);
}
j--;
}
if(a[n-1]>=1) sum++;//计算个位
printf("%d\n",sum);
return 0;
}