博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
找“1”的个数
阅读量:7091 次
发布时间:2019-06-28

本文共 1057 字,大约阅读时间需要 3 分钟。

一、题目:

    给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。要求:

     1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12)  = 5。

     2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

二 思路

    总体是寻找各个位置上1的个数。首先需要把数字进行拆分,这是有三种情况需要考虑,即等于0,等于1,和大于1;比如有一数abcde,当计算c位上的1的个数,需要看ab、c、de的情况:

               当c=0时,受高位影响,百位上出现1的个数为:(ab)*100

               当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1)

               当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100

依次类推,就可计算出1的个数。

三代码

#include 
using namespace std;int CN(int n){ int c=0; int f=1; int LN=0; int CurN=0; int HN=0; while (n/f!=0) { LN=n-(n/f)*f; CurN=(n/f)%10; HN=n/(f*10); if(CurN==0) c=c+HN*f; else if(CurN==1) c=c+HN*f + LN +1; else c=c+(HN+1)*f; f=f*10; } return c;}int main(){ int n,i,k; cout<<"请输入数字:"<
>n; cout<
<<"中出现数字1的个数为:"; cout<
<

  四 截图

 

五 总结

   这题的关键是找规律,要把数字进行拆分,每个位上的数都和该数的高低位数有关系,做这种题就要多写几个数,找到规律就容易了。

转载于:https://www.cnblogs.com/bingoing/p/4549563.html

你可能感兴趣的文章
求最大值及其下标
查看>>
关于类型“LinkButton”的控件“xxx”必须放在具有 runat=server 的窗体标记内问题的解决方案...
查看>>
Javascript:DOM表格操作
查看>>
解决WCF传输大数据量时出错并提示:远程主机强迫关闭了一个现有的连接
查看>>
蓝桥杯-波动数列
查看>>
图片理论基础
查看>>
HDU4300 Clairewd’s message
查看>>
【原】iOS学习之图片拉伸处理(类似qq的气泡)
查看>>
postman抓包
查看>>
最大稳定极值区域(MSER)检测
查看>>
如何解决CorelDRAW中尖突问题
查看>>
Javascript实现Web颜色值转换
查看>>
拼接日期填写表单
查看>>
工控系统安全问题汇总(一)
查看>>
c#加载XML文档
查看>>
COGS 2259 异化多肽——生成函数+多项式求逆
查看>>
3Sum Closest leetcode
查看>>
Docx4j替换word
查看>>
CCF201604试题
查看>>
ionic + cordova 配置和开发过程中的一些问题
查看>>