1的个数

一:题目

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

要求:(1) 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。

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

二:设计思路

首先对于第一个问题,根据王老师的提示,想到计算出每个个十百千位上各出现几次1相加即可,考虑各个位上的数等于0,1以及大于1三种情况即可找到规律。

三:代码

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int geshu(int value)
 5 {
 6     int a,b,c,d,e,a1,b1,c1,d1,e1,sum;
 7     a=0;b=0;c=0;d=0;e=0;
 8     a=value%10;
 9     b=value/10;
10     b=b%10;
11     c=value/100;
12     c=c%10;
13     d=value/1000;
14     d=d%10;
15     e=value/10000;
16     cout<<"各位上的数字分别为:"<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e;
17     if(a==0)
18         a1=b*1+c*10+d*100+e*1000;
19     else
20         a1=1+b*1+c*10+d*100+e*1000;
21     if(b==0)
22         b1=c*10+d*100+e*1000;
23     else if(b==1)
24         b1=a+1+c*10+d*100+e*1000;
25     else
26         b1=10+c*10+d*100+e*1000;
27     if(c==0)
28         c1=d*100+e*1000;
29     else if(c==1)
30         c1=a+1+b*10+d*100+e*1000;
31     else
32         c1=100+d*100+e*1000;
33     if(d==0)
34         d1=e*1000;
35     else if(d==1)
36         d1=a+1+b*10+c*100+e*1000;
37     else
38         d1=1000+e*1000;
39     if(e==0)
40         e1=0;
41     else if(e==1)
42         e1=a+1+b*10+c*100+d*1000;
43     else
44         e1=10000;
45     sum=a1+b1+c1+d1+e1;
46     return sum;
47 }
48 
49 void main()
50 {
51     int value,sum;
52     cout<<"请输入一个整数:";
53     cin>>value;
54     while(value<0||value>=100000)
55     {
56         cout<<"请重新输入:";
57         cin>>value;
58     }
59     sum=geshu(value);
60     cout<<endl<<"1的个数为:"<<sum<<endl;
61 }

四:实验截图

五:总结

对于这种数的计算很多都是查找规律,只要找到一个规律突破点那么这个题目迎刃而解,遇到这种情况先列举几个简单而又特殊的例子通过例子找规律,这样就会变得容易的多。

原文地址:https://www.cnblogs.com/dyc940210/p/4552922.html