zoukankan      html  css  js  c++  java
  • 找出十进制数中出现的''一''的个数

    一、题目要求:

    给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
    要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12)  = 5。
        2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
    二、解决思路
      通过列举几个数进行计算,可以发现函数f(N)规律如下:
      1.一位十进制数:当N>=1时,f(N)=1;当N=0时,f(N)= 0;
      2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;
              f(23)=个位出现1的个数+十位出现1的个数=3+10=13;
              ......
              f(93)=个位出现1的个数+十位出现1的个数=10+10=20;
      3.三位十进制数:f(103)=个位出现1的个数+十位出现1的个数+百位出现1的个数=(10+10)+1+100;
                                f(203)=...=(10+10)*2+1+100;

                                f(303)=...=(10+10)*3+(1)+100;

                                ......

         
      4.f(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 "iostream.h"
     2 #include "stdlib.h"
     3 int CountNum(int n)
     4 {
     5     int count=0; 
     6     int factor=1; 
     7     int LowerNum=0;
     8     int CurNum=0;
     9     int HigherNum=0;
    10     while (n/factor!=0)       
    11     {
    12         LowerNum=n-(n/factor)*factor;
    13         CurNum=(n/factor)%10;
    14         HigherNum=n/(factor*10);
    15         switch (CurNum)
    16         {
    17         case 0:
    18             count=count+HigherNum*factor;
    19             break;
    20         case 1:
    21             count=count+HigherNum*factor + LowerNum +1;
    22             break;
    23         default:
    24             count=count+(HigherNum+1)*factor;
    25             break;
    26         }
    27         factor=factor*10;
    28     }
    29     return count;
    30 }
    31 
    32 int main()
    33 {
    34     int num;
    35     cout<<"请输入数字:
    ";
    36     cin>>num;
    37     cout<<"
    ";
    38     cout<<num<<"中出现数字1的个数为:
    ";
    39     cout<<CountNum(num)<<endl;
    40     return 0;
    41 }

    四、代码截图

    五、实验心得

            当我们拿到看似没有思路的问题时,可以列举一下有代表性的数,从中找取规律,比如这次实验中,看似无从下手,但是当我们把每个阶段的数据列举出来时,便可以找到其中的规律。

  • 相关阅读:
    【bzoj1116】[POI2008]CLO 并查集
    【bzoj3831】[Poi2014]Little Bird 单调队列优化dp
    【bzoj4726】[POI2017]Sabota? 树形dp
    【bzoj4822/bzoj1935】[Cqoi2017]老C的任务/[Shoi2007]Tree 园丁的烦恼 树状数组
    【bzoj4884】[Lydsy2017年5月月赛]太空猫 dp
    【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
    【bzoj2424】[HAOI2010]订货 费用流
    【bzoj2662】[BeiJing wc2012]冻结 分层图Spfa
    【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
    【bzoj4818】[Sdoi2017]序列计数 矩阵乘法
  • 原文地址:https://www.cnblogs.com/yuanyajiao/p/4474992.html
Copyright © 2011-2022 走看看