课堂练习——找1

题目要求:

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

     要求:   

      1.写一个函数 f(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(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=13+20+24=57;     

  4.f(abcde),计算c位上的1的个数,需要看abcde的情况:

    当c=0时,受高位影响,百位上出现1的个数为:(ab)*100

    当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1)

    当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100

二、程序代码

    

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

三、运行结果截图

   

    

    

四、总结与心得

    本次实验的题目是找1的个数,完成时设计思路花费的时间比较长,主要是用于总结规律,对于这种偏于数学应用方面的题目,只要找到规律,那么所有问题都不再困难。这也给我们提示,在我们平时解决问题时,一定要多加思考,这样才能事半功倍。

    

 

原文地址:https://www.cnblogs.com/mudanhuakai/p/4473960.html