您的位置:首页 > 其它

软件工程课堂练习--找“一”

2015-05-03 19:00 162 查看
一、题目要求

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

要求:

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

    2.在32位整数范围内,满足条件的“f(N) =N”的最大的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的个数=(10+10)*1+(3+10)+24=57;

f(199)=...=(10+10)*2+100;

f(203)=...=(10+10)*2+1+100;

f(213)=...=(10+10)*2+(2+4)+100;

......

f(303)=...=(10+10)*3+(1)+100;

......

  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出现次数的部分代码

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;
}


四、截图







五、实验总结

根据老师的提示将数字分开看,分别看个位和十位..中“1”出现的次数,依次列举出来,很容易的就能找到规律
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: