求解:从1到n整数中1出现的次数。比如n=12时,1、10、11、12共出现了5个1.
这是剑指offer的一道题,但是在网上看到了一个精妙的解法。
解:
个位出现的次数=n/10 + (个位数>1时:+1) + (个位数==1时:+1)
十位出现的次数=n/100*10 + (十位数>1时:+10) +(十位数==1时:+n%10+1)
百位出现的次数=n/1000*100+ (百位数>1时:+100) +(百位数==1时:+n%100+1)
以此类推......
位数等于1时,相当于加上它的所有低位值+1,比如:
112 它的百位等于1,就是112/1000*100+(12+1);
126它的百位就是126/1000*100+(26+1)
举一个完整的例子:对于数1139来说:
个位=1139/10+1
十位=1139/100*10+10
百位=1139/1000*100+(39+1)
千位=1139/10000*1000+(139+1)
#include<iostream>
using namespace std;
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int dig = 10;
int N = n, ans = 0;
while(N){
ans += n/dig*(dig/10)+(N%10==1?(n%(dig/10)+1):(N%10>1?dig/10:0));
N /= 10;
dig *= 10;
}
return ans;
}
};
int main(){
Solution s;
int n;
while(1){
cin>>n;
cout<<s.NumberOf1Between1AndN_Solution(n)<<endl;
}
return 0;
}