通过对于N的每一位n进行分析,发现规律
(1) n > 1 (高位+1) * 位数 例如 21200 在百位上出现1的次数 为 (21+1) * 100 100-199 , 1100- 1199 , ... , 21100-21199 (此处只考虑百位上出现1的次数,下同)
(2) n = 1 高位 * 位数 + 低位 + 1 例如 21111 在百位上出现1的次数 为 (21+1) * 100 100-199 , 1100- 1199 , ... , 21100-21111 (此处只考虑百位上出现1的次数,下同)
(3) n = 0 高位 * 位数 例如 21000 在百位上出现1的次数 为 21 * 100 100-199 , 1100- 1199 , ... , 20000-20099 (此处只考虑百位上出现1的次数,下同)
代码如下
#include<iostream>
using namespace std;
int sum1(int n){
int weishu = 1;
int current;
int high;
int low;
int sum = 0;
if(n <=0) return 0;
while(n/weishu){
switch((n/weishu)%10){
case 0:
sum += n/(weishu*10) * weishu;
break;
case 1:
sum += n/(weishu*10) * weishu + n%(weishu)+1;
break;
default:
sum += (n/(weishu*10) + 1) * weishu;
break;
}
weishu*=10;
}
return sum;
}
int main(){
int n;
while(cin>>n){
cout<< sum1(n)<<endl;
}
}