问题:
输入十进制数字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);
- }
- }
本文介绍了一种方法,通过计算每一位上数字1出现的次数来统计任意十进制数内所有数字1的总出现次数。具体包括计算个位、十位、百位等特定位置上数字1的出现频率,并提供了实现该方法的C++代码示例。
457

被折叠的 条评论
为什么被折叠?



