课堂练习——找1
题目要求:
给定一个十进制的正整数,写下从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(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=13+20+24=57;
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 // 找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<<"请输入数字:\n"; 40 cin>>num; 41 cout<<"\n"; 42 cout<<num<<"出现数字1的个数为:\n"; 43 cout<<count(num)<<endl; 44 return 0; 45 }
三、运行结果截图
四、总结与心得
本次实验的题目是找1的个数,完成时设计思路花费的时间比较长,主要是用于总结规律,对于这种偏于数学应用方面的题目,只要找到规律,那么所有问题都不再困难。这也给我们提示,在我们平时解决问题时,一定要多加思考,这样才能事半功倍。