给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
思路:我是根据老师课上提出的思路,
在从X0--X9(x是任意小于等于9的数字)之内只有一个1
在任意X00--X99之内也只有一段x1y(x,y均为常数)
以此类推
比如求23以内的1的个数,23包含0--9,10--19,20--23这三段,每一段各位都含有一个一,而10--19十位也是1所以这一段就包含10个1,所以一共13个一。
比如求100以内的1的个数,100包含0--9,10--19,20--29......90--99这十段,每一段各位都含有一个一共是个1,而10--19十位也是1所以这一段就包含10个1,但是要注意的是100也含有一个1,所以一共23个一。
具体代码实现如下:(编译环境:vs2008,语言c++)
#include <iostream> #include <cmath> using namespace std; #define N 5 int findone(int i){ int a[N]; int p = 0,j,num = i; ; int sum = 0; while(i){ if(p < N){ a[p] = i%10; i = i/10; } p++; } if(a[p-1]!=1){ for(j = 0;j < p;j++){ if(a[j] >= 1) sum += int((num/pow(10,double(j+1))+1))*int(pow(10,double(j))) ; else sum += int((num/pow(10,double(j+1))))*int(pow(10,double(j))) ; } } if(a[p-1]==1){ int figure = num; for(j = 0;j < p-1;j++){ if(a[j] >= 1) sum += int((num/pow(10,double(j+1))+1))*int(pow(10,double(j))) ; else sum += int((num/pow(10,double(j+1))))*int(pow(10,double(j))) ; figure = int(a[j]*pow(10,double(j))); } sum = sum+figure+1; } return sum; } void main(){ int i; cout<<"please input a number :"<<endl; cin>>i; cout<<"the amount of 1 is : "<<findone(i)<<endl; system("pause"); }
总结,刚开始的时候老师提出要找规律觉得会很难实现,可是当自己认真做的时候发现其实并不是很难只要发现规律代码就很容易能实现
时间: 2024-11-05 18:38:21