思路对于一个数N,N的最高位数值为T,N长度为L ,那么我们可以吧N分为两个部分 ,令M=N-T*10^(L-1)+1, 分割为[0,M-1] 和 [M,A]两个部分,第一个部分可以用递归来求解,
第二个部分要计算了, 首先我们知道 000~999当中存在一的个数为 10^(L-1)*L,L为999的位长度, 那么就可以通过此来计算[M,A]中有多少个1了
#include<iostream> #include<iomanip> #include<cmath> using namespace std; int fun(int n) { //cout<<n<<endl; int L=0,T,a,M,sum; a=n; while(a!=0) { L++; T=a; a/=10; } //cout<<"L:"<<L<<" T:"<<T<<endl; if(L==1) { return 1; } M=n-T*pow(10.0,L-1)+1; //cout<<"M:"<<M<<endl; sum=T*(pow(10.0,L-2))*(L-1)+(n-pow(10.0,L-1)+1); //cout<<"sum: "<<sum<<endl; sum+=fun(M-1); return sum; } void main() { int a=13; int r=fun(a); cout<<"计算结果:"<<r<<endl; system("pause"); }