1的个数
1.题目:
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
1.写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
2.实现思路:
1.分别统计1-N所有数字的个位、十位、百位、千位和万位上面1的个数。如下图所示。个位上的1用表示,十位上的1用表示,百位上的1用表示。
2.各个位上1的个数通过公式计算得出。
3.下面介绍计算的方法:
1.随意给定一个数字N,
2.首先分解得出各个位上的数字,这里假设个、十、百、千、万位上的数字分别为a,b,c,d,e.
若1-N所有数字个位上1的个数为a1.则
若1-N所有数字个位上1的个数为b1.则
其他同理……
4.源代码:
#include<iostream> using namespace std; int geshu(int value) { int a,b,c,d,e,a1,b1,c1,d1,e1,sum; a=0;b=0;c=0;d=0;e=0; a=value%10; b=value/10; b=b%10; c=value/100; c=c%10; d=value/1000; d=d%10; e=value/10000; cout<<"各位上的数字分别为:"<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e; if(a==0) a1=b*1+c*10+d*100+e*1000; else a1=1+b*1+c*10+d*100+e*1000; if(b==0) b1=c*10+d*100+e*1000; else if(b==1) b1=a+1+c*10+d*100+e*1000; else b1=10+c*10+d*100+e*1000; if(c==0) c1=d*100+e*1000; else if(c==1) c1=a+1+b*10+d*100+e*1000; else c1=100+d*100+e*1000; if(d==0) d1=e*1000; else if(d==1) d1=a+1+b*10+c*100+e*1000; else d1=1000+e*1000; if(e==0) e1=0; else if(e==1) e1=a+1+b*10+c*100+d*1000; else e1=10000; sum=a1+b1+c1+d1+e1; return sum; } void main() { int value,sum; cout<<"请输入一个整数:"; cin>>value; while(value<0||value>=100000) { cout<<"请重新输入:"; cin>>value; } sum=geshu(value); cout<<endl<<"1的个数为:"<<sum<<endl; }
5.实验结果截图