标签:
一、题目要求:
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。
例如 f(12) = 5。 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二、解题思路:
通过对几个特定数的分析,寻找规律,比如:“10”=1+1;“13”=2+4;“123”=3+1+53……
先将个位上的“1”算出,再算十位上的“1”,最后再算出百位上的“1”,然后再加起来即可。
三、C++代码:
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 5 void find(int n) 6 { 7 int m=n,a,b,c,s=0,p=0; //n是要求的十进制正整数 8 double k=0; 9 while(m/10!=0) 10 { 11 a=m/10; //a为n的十位数 12 b=m%10; //b为n的个位数 13 if(k==0) 14 { 15 if(b==0) 16 { 17 s+=a; 18 } 19 else 20 { 21 s=s+a+1; 22 } 23 } 24 else 25 { 26 if(b==1) 27 { 28 s=s+(n/pow(10,k+1))*10+n%(int)pow(10,k); 29 } 30 else if(b==0) 31 { 32 s=s+n/pow(10,k); 33 } 34 else 35 { 36 p=n/pow(10,k+1); 37 s=s+(p+1)*10; 38 } 39 } 40 m=m/10; 41 k++; 42 } 43 if(m==1) 44 { 45 c=n-m*pow(10,k); 46 s=s+c+1; 47 } 48 else 49 { 50 c=pow(10,k); 51 s=s+c; 52 } 53 54 cout<<s; // s为“1”的总和 55 } 56 57 void main() 58 { 59 int i; 60 cout<<"请输入一个十进制的正整数:"; 61 cin>>i; 62 cout<<endl; 63 cout<<"‘1‘出现的个数为:"; 64 find(i); 65 cout<<endl; 66 }
四、截图:
五、实验总结:
通过这次实践,在考虑问题方面,需要逐步逐层地分析,先从简单问题入手,运用化归的数学思想,将问题慢慢转化为自己能够解决的问题,而不是从终端开始,很麻烦的解决问题。
标签:
原文地址:http://www.cnblogs.com/itlangguojie/p/4551444.html