转自:http://hi.baidu.com/zhaoshengjin/blog/item/f1df6618cb1debbe4bedbc5d.html

问题描述:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数。例如:
N = 2,写下1,2。这样只出现了1个"1"。
N = 12,写下1,2,……,12,这样有5个"1"。
写一个函数f(N),返回1到N之间出现的"1"的个数,比如f(12) = 5。

假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字。如果要计算百位上出现1

的次数,将受3方面因素影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字。

如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知

道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个。也就是

由更高位数字(12) 决定,并且等于更高位数字(12)×当前位数(100)。

如果百位上的数字为1,则可以知道,百位上可能出现1的次数不仅受更高位影响,还受低位影响,

也就是由更高位和低位共同决定。例如12 113, 受更高位影响,百位出现1的情况是100-199,1 100

-1 199,……,11 100-11 199,一共有1 200个,和上面第一种情况一样,等于更高位数字(12)×当

前位数(100)。但它还受低位影响,百位出现1的情况是12 100-12 113,一共14个,等于低位数字

(13)+1。一共为1200+14 = 1214.

如果百位上数字大于1(即为2-9),则百位上可能出现1的次数也仅由更高位决定,比如12 213,则

百位出现1的情况是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300个

,并且等于更高位数字+1(12+1)×当前位数(100)。

今天百度之星的第二题就是求几个数出现的次数,比如求12388以内以88结尾的所有数的数量,如果最后两位>=88则数量为123+1,但是如果最后两位<88,数量为123。一定要谨慎,多少次教训了!

按照位来统计在这个位上所有的1的个数

#include <iostream>
#include <windows.h>
using namespace std;

LONGLONG Sum1s( ULONGLONG n )
{
    ULONGLONG iCount = 0;
    ULONGLONG iFactor = 1;

ULONGLONG iLowerNum = 0;
    ULONGLONG iCurrNum = 0;
    ULONGLONG iHigherNum = 0;

//从数n的最低位开始,n/iFactor表示的是当前处理的数的数值

//譬如数1234,则n/iFactor依次表示 1234,123,12,1

while( n / iFactor != 0 )
    {
        iLowerNum = n - ( n / iFactor ) * iFactor;
        iCurrNum = (n / iFactor ) % 10;
        iHigherNum = n / ( iFactor *10 );

switch( iCurrNum )
        {
        case 0:
            iCount += iHigherNum * iFactor;
            break;
        case 1:
            iCount += iHigherNum * iFactor + iLowerNum + 1;
            break;
        default:
            iCount += ( iHigherNum + 1 ) * iFactor;
            break;
        }

iFactor *= 10;
    }
    return iCount;
}

int main()
{
    cout << Sum1s(100000000);

cin.get();    
    return 0;
}

计算1到N的十进制数中1的出现次数相关推荐

  1. C语言与,或,非,同或,异或,左移,右移及优先级,查表法计算一个十进制数中1的个数

    1.与:& 2.或:| 3.非:~ 4.异或:^ 5.同或:~^ 6.左移:(<<) 7.右移:(>>) 注意:位运算符中求反运算"~"优先级最高, ...

  2. 字长为16位的计算机_字长为16位表示这台计算机最大能计算一个16位的十进制数...

    字长为16位表示这台计算机最大能计算一个16位的十进制数 答:× 以下为绿松石的鉴定特征是: 答:内凹的"铁线" 绿蓝色 天蓝色 白色细纹 通常酒店为保证类客人保留客房至 答:入住 ...

  3. 求1~n这n个整数十进制表示中1出现的次数

    文章目录 题目 思路 代码 复杂度分析 题目 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,那么1-12这些整数中包含1 的数字有1.10.11和12.可得1一共 ...

  4. 算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值

    3 计算数字k在0到n中的出现的次数,k可能是0~9的一个值 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1 ...

  5. python 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值

    3. 统计数字 中文English 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. Example 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 ...

  6. 计算机十进制数中码数有几个,计算机中的数和码

    <计算机中的数和码>由会员分享,可在线阅读,更多相关<计算机中的数和码(27页珍藏版)>请在人人文库网上搜索. 1.第第1章章 计算机中的数和码计算机中的数和码 微机系统原理及 ...

  7. 数据结构-剑指offer-整数中1出现的次数

    题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.AC ...

  8. 剑指offer--整数中1出现的次数

    一个更好的办法是利用数学公式直接计算出最终的结果,该方法是依次求出数字 X 在个位.十位.百位等等出现的次数,再相加得到最终结果.博客地址 从 1 至 10,在它们的个位数中,任意的 X 都出现了 1 ...

  9. 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值。

    思想:按位分析,从个位开始一位位分析,最后计算每个位中K出现次数的和 对个位进行分析: 例1:n=723, k=1 即((n%10)>k) 个位:个位出现1的情况为001,011,021-711 ...

最新文章

  1. bzoj2396:神奇的矩阵
  2. Ubuntu16.04 + ROS kinetic + 激光slam-cartographer ROS + 数据仿真 + Turtlebot3仿真
  3. GDCM:gdcm::Decoder的测试程序
  4. 轻量级.Net Core服务注册工具CodeDi发布啦
  5. java的核心类库_Java核心类库,集合框架
  6. MediaInfo源代码分析 3:Open()函数
  7. [地图SkyLine二次开发]框架(2)
  8. Go语言爱好者周刊:第 131 期 — 这道题你做对了吗?
  9. 使用TinyPNG的API进行图片压缩
  10. 将APP发布到各大官方网站的方法,如华为、360手机助手、小米等
  11. 安装步骤_Saber 2016 安装步骤
  12. paddlespeech 语音识别 web流服务部署(Streaming Speech Recognition)
  13. 5G时代下催生了云电脑,云电脑带来了什么?
  14. 如何提高论文阅读速度?
  15. luogu 1558 色板游戏
  16. 全球及中国二手车市场销量渠道规模及发展格局建议报告2021-2027年
  17. 从零开始开发、运营微信小程序的5点感受
  18. c语言求同时被3和7,c语言输入一个数 判断该数能否同时被3和7整除 如果能整除 则输出yes...
  19. 无线传感器网络WSN覆盖优化问题
  20. 内核 TCP 参数调优

热门文章

  1. 一、专栏作者润森闲谈数据分析
  2. LSTM之父重提30年前的「快速权重存储系统」:线性Transformer只是它的一种变体...
  3. FGPM:文本对抗样本生成新方法
  4. ACM公选课第八节DP基础3 2020.4.23-5.10补
  5. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法
  6. MySQL---第07章_单行函数
  7. show attend and tell 计算bleu分数(1到4)
  8. shiro框架_Shiro安全框架(下)
  9. 【Redis系列】深入浅出Redis主从复制之读写分离【一篇搞懂Redis复制】
  10. java高位转低位注意事项,int转 short/byte溢出过程