标签:
一:题目
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:(1) 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
(2)在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二:设计思路
首先对于第一个问题,根据王老师的提示,想到计算出每个个十百千位上各出现几次1相加即可,考虑各个位上的数等于0,1以及大于1三种情况即可找到规律。
三:代码
1 #include<iostream> 2 using namespace std; 3 4 int geshu(int value) 5 { 6 int a,b,c,d,e,a1,b1,c1,d1,e1,sum; 7 a=0;b=0;c=0;d=0;e=0; 8 a=value%10; 9 b=value/10; 10 b=b%10; 11 c=value/100; 12 c=c%10; 13 d=value/1000; 14 d=d%10; 15 e=value/10000; 16 cout<<"各位上的数字分别为:"<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e; 17 if(a==0) 18 a1=b*1+c*10+d*100+e*1000; 19 else 20 a1=1+b*1+c*10+d*100+e*1000; 21 if(b==0) 22 b1=c*10+d*100+e*1000; 23 else if(b==1) 24 b1=a+1+c*10+d*100+e*1000; 25 else 26 b1=10+c*10+d*100+e*1000; 27 if(c==0) 28 c1=d*100+e*1000; 29 else if(c==1) 30 c1=a+1+b*10+d*100+e*1000; 31 else 32 c1=100+d*100+e*1000; 33 if(d==0) 34 d1=e*1000; 35 else if(d==1) 36 d1=a+1+b*10+c*100+e*1000; 37 else 38 d1=1000+e*1000; 39 if(e==0) 40 e1=0; 41 else if(e==1) 42 e1=a+1+b*10+c*100+d*1000; 43 else 44 e1=10000; 45 sum=a1+b1+c1+d1+e1; 46 return sum; 47 } 48 49 void main() 50 { 51 int value,sum; 52 cout<<"请输入一个整数:"; 53 cin>>value; 54 while(value<0||value>=100000) 55 { 56 cout<<"请重新输入:"; 57 cin>>value; 58 } 59 sum=geshu(value); 60 cout<<endl<<"1的个数为:"<<sum<<endl; 61 }
四:实验截图
五:总结
对于这种数的计算很多都是查找规律,只要找到一个规律突破点那么这个题目迎刃而解,遇到这种情况先列举几个简单而又特殊的例子通过例子找规律,这样就会变得容易的多。
标签:
原文地址:http://www.cnblogs.com/dyc940210/p/4552922.html