一、题目要求
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二、设计思路
列举几个数发现如下规律:
1、一位数:N=0时,f(N)=0;N>0时,f(N)=1;
2、两位数:f(13)=2+4=6; f(23)=3+10=13
3、三位数:f(113)=12+14+14=40
......
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
三、程序代码
// zhao111.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdlib.h" int CountNum(int n) { int count=0; int factor=1; int LowerNum=0; int CurNum=0; int HigherNum=0; while (n/factor!=0) { LowerNum=n-(n/factor)*factor; CurNum=(n/factor)%10; HigherNum=n/(factor*10); switch (CurNum) { case 0: count=count+HigherNum*factor; break; case 1: count=count+HigherNum*factor + LowerNum +1; break; default: count=count+(HigherNum+1)*factor; break; } factor=factor*10; } return count; } int main() { int num; printf("请输入一个数:"); scanf("%d",&num); printf("%d中出现“1”的个数为:%d ",num,CountNum(num)); return 0; }
四、运行结果
五、心得体会
这个题老师也点出来重要的是找规律。所以我想分成几种情况考虑。这个数是一位的时候,2位十位是1,2,3,4.....时,三位百位是1,2,3,4.....时。然后又让找abcde的规律。其实找规律的过称特别麻烦。中间有的经常漏掉。这样就走了不少弯路。后来仔细检查后,规律就出来了。有了规律,编程就很简单了。看来好的想法很重要。