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 }

    四、代码截图

    五、实验心得

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

  • 相关阅读:
    HDU 2639 Bone Collector II (01背包,第k解)
    POJ 2184 Cow Exhibition 奶牛展(01背包,变形)
    hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
    UVA 562 Dividing coins 分硬币(01背包,简单变形)
    POJ Charm Bracelet 挑饰品 (常规01背包)
    hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)
    UVA 624 CD(01背包,要记录路径)
    118 Pascal's Triangle 帕斯卡三角形 杨辉三角形
    117 Populating Next Right Pointers in Each Node II 每个节点的右向指针 II
    116 Populating Next Right Pointers in Each Node 每个节点的右向指针
  • 原文地址:https://www.cnblogs.com/yuanyajiao/p/4474992.html
Copyright © 2011-2022 走看看