“找一”
给定一个十进制的正整数,写下从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,所以一共21个一。
具体代码实现如下:(编译环境:vs2008,语言c++)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #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" ); } |
总结,刚开始的时候老师提出要找规律觉得会很难实现,可是当自己认真做的时候发现其实并不是很难只要发现规律代码就很容易能实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端