zoukankan      html  css  js  c++  java
  • 找一

    1.题目:

    • 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
    • 要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。

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

    2.设计思路:

    课上对于3,13,23,33,43,53,63,73,83,93,103,。。。求解其中1的个数,通过特殊数总结一般规律,进而求得f(N),从而编程实现。

    推广:若abcde表示任意位数的整数,对其中c位进行总结,那么:

    • 若c=0,则c位为1的个数为ab*(c位);
    • 若c=1,则c位为1的个数为ab*(c位)+de+1;
    • 若c>0,则c位为1的个数为(ab+1)*(c位);

    3.源代码:

     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 }

    4.结果截图:

    5.心得体会:

    通过特殊找一般,是编程乃至解决生活中大部分问题的常用方法,运用这一方法,相信对以后编程开发更有帮助吧。

  • 相关阅读:
    8.【原创】使用Java8中的Stream特性筛选数据
    27.【转载】如何避免回表查询,什么是索引覆盖
    17.【转载】广东省2020学位英语考试报考须知
    Java 正则?:?=?!的理解
    集合的优化操作
    ArrayList中remove方法和set(null)的区别
    POI 导入、导出Excel
    JS 跳转到新页面并用post传参
    win 10 如何关闭自动更新
    JSON定义及应用
  • 原文地址:https://www.cnblogs.com/zhengt/p/4470334.html
Copyright © 2011-2022 走看看