• 课堂练习之找“1”的个数


    一、题目

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

    二、要求

        1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;

        2、在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少;

    三、思路

    情况1:如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知 道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个。也就是 由更高位数字(12) 决定,并且等于更高位数字(12)×当前位数(100)。

    情况2:如果百位上的数字为1,则可以知道,百位上可能出现1的次数不仅受更高位影响,还受低位影响, 也就是由更高位和低位共同决定。例如12 113, 受更高位影响,百位出现1的情况是100-199,1 100 -1 199,……,11 100-11 199,一共有1 200个,和上面第一种情况一样,等于更高位数字(12)×当前位数(100)。但它还受低位影响,百位出现1的情况是12 100-12 113,一共114个,等于低位数字 (113)+1。

    情况3:如果百位上数字大于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)。

    四、程序源码

     1 #include <iostream.h>
     2 
     3 long int Find(int n)
     4 {
     5     long int count=0;      //1的个数
     6     long int F=1;       //当前位
     7     long int LNum=0;    //低位数字
     8     long int CNum=0;    //当前数字
     9     long int HNum=0;    //高位数字
    10     if(n<=0)
    11     {
    12         return 0;
    13     }
    14     while(n/F!=0)
    15     {
    16         LNum=n-(n/F)*F;   //低位数字
    17         CNum=(n/F)%10;    //当前数字
    18         HNum=n/(F*10);    //高位数字
    19         if(CNum==0)
    20         {
    21             count +=HNum*F;
    22         }
    23         else if(CNum==1)
    24         {
    25             count+=HNum*F+LNum+1;
    26         }
    27         else
    28         {
    29             count+=(HNum+1)*F;
    30         }
    31         F*=10;
    32     }
    33     return count;
    34 }
    35 
    36 int main()
    37 {
    38     long int n;
    39     cout<<"请输入一个数n(n>0):";
    40     cin>>n;
    41     cout<<"1的个数为:"<<Find(n)<<endl;
    42     return 0;
    43 }

    五、运行截图

    六、实验总结

        通过本次课堂联系,让我学习到了在遇到类似问题的时候应该先举例运算,并在计算过程中找出规律,根据找出的规律

    通过代码来实现题目的要求。

  • 相关阅读:
    枚举类型的应用
    动手动脑
    四则运算和验证码--源码
    ATM源码
    javabean+jsp+servlet+jdbc
    四则运算改良
    Java异常
    课后总结
    包装类Integre
    对象验证
  • 原文地址:https://www.cnblogs.com/yuji5656/p/4465880.html
Copyright © 2020-2023  润新知