一 问题说明
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二 设计思路
通过分析,发现可以将这个数中每位数分开讨论,比如327,1-327先讨论个位上出现1的个数,然后十位,最后是百位,最后将它们相加,最后可以得到最终结果。每一位上出现1的个数都是与相邻位上的数息息相关的。
三 代码实现
#include<iostream> #include<math.h> using namespace std; void find(int n) { int m=n,a,b,c,s=0,p=0; double k=0; while(m/10!=0) { a=m/10; b=m%10; if(k==0) { if(b==0) s=s+a; else s=s+a+1; } else { if(b==1) { s=s+(n/pow(10,k+1))*10+n%(int)pow(10,k); } else if(b==0) { s=s+n/pow(10,k); } else { p=n/pow(10,k+1); s=s+(p+1)*10; } } m=m/10; k++; } if(m==1) { c=n-m*pow(10,k); s=s+c+1; } else { c=pow(10,k); s=s+c; } cout<< s; } void main() { int i; cout<<"请输入一个数:"; cin>>i; find(i); }
四 截图
五 总结
这个问题困扰了很久,毫无头绪。最后还是得需要思考,一步一步找规律才能将问题解决,所以要将问题分析透彻,就需要一步步地找规律,然后才可以总结出一套完整的解决方案。