问题:
输入十进制数字N,统计从1到N的连续数字中,所有的1出现的次数。
例如:
•N = 3, f(3) = 1 (只有一位数字的情况)
•(两位数字的情况)
•N = 13, f(13) = 6
2+4
•N = 23 ,f(23) = 13
3+10
•N = 33, f(33) = 14
10+4
•……
•N = 99, f(99) = 20
10+10
•N = 123
•个位出现1个数:13
•十位数出现1个数:20
•百位出现1个数:24
•同理,我们可以分析4位数、5位数。。。
总结规律:
计算方法:可以通过分别计算每一位上出现1的次数,最后加和统计一共出现的次数
引出问题:
怎样计算某一特定位上1出现的次数?
假设N=abcde,要计算其百位上1出现的次数,
它受到
三个因素的影响:
百位以上的数字,百位以下的数字,百位上的数字。
当百位数字c=0时,百位上出现1的次数只受
百位以上的数字影响
12045:百位上1出现的次数为12*100=1200 次
当百位数字c=1时,百位上出现1的次数只受
百位以上的数字,百位以下的数字共同影响
12145:百位上1出现的次数为12*100+45+1 次
当百位数字c>1时,百位上出现1的次数只受
百位以上的数字影响
12345:百位上1出现的次数(12+1)*100=1300次
其他各位也是依然这样计算。
- #include <iostream>
- using namespace std;
- void fun(int N)
- {
- int factor=1;
- int count=0;
- int low,cur,high;
- while (N/factor)
- {
- low = N - (N/factor)*factor;
- cur = (N/factor)%10;
- high = N/(factor*10);
- switch(cur)
- {
- case 0:
- count += high*factor;
- break;
- case 1:
- count += high*factor+low+1;
- break;
- default:
- count += (high+1)*factor;
- break;
- }
- factor *=10;
- }
- cout<<count<<endl;
- }
- int main()
- {
- int n;
- while(cin>>n)
- {
- if(n==-1) break;
- fun(n);
- }
- }