课堂练习之找“1”的个数
2015-04-29 14:20
232 查看
一、题目
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数出其中1的个数。
二、要求
1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;
2、在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少;
三、思路
情况1:如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知 道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个。也就是 由更高位数字(12) 决定,并且等于更高位数字(12)×当前位数(100)。
情况2:如果百位上的数字为1,则可以知道,百位上可能出现1的次数不仅受更高位影响,还受低位影响, 也就是由更高位和低位共同决定。例如12 113, 受更高位影响,百位出现1的情况是100-199,1 100 -1 199,……,11 100-11 199,一共有1 200个,和上面第一种情况一样,等于更高位数字(12)×当前位数(100)。但它还受低位影响,百位出现1的情况是12 100-12 113,一共114个,等于低位数字 (113)+1。
情况3:如果百位上数字大于1(即为2-9),则百位上可能出现1的次数也仅由更高位决定,比如12 213,则 百位出现1的情况是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300个 ,并且等于更高位数字+1(12+1)×当前位数(100)。
四、程序源码
五、运行截图
六、实验总结
通过本次课堂联系,让我学习到了在遇到类似问题的时候应该先举例运算,并在计算过程中找出规律,根据找出的规律
通过代码来实现题目的要求。
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数出其中1的个数。
二、要求
1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;
2、在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少;
三、思路
情况1:如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知 道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个。也就是 由更高位数字(12) 决定,并且等于更高位数字(12)×当前位数(100)。
情况2:如果百位上的数字为1,则可以知道,百位上可能出现1的次数不仅受更高位影响,还受低位影响, 也就是由更高位和低位共同决定。例如12 113, 受更高位影响,百位出现1的情况是100-199,1 100 -1 199,……,11 100-11 199,一共有1 200个,和上面第一种情况一样,等于更高位数字(12)×当前位数(100)。但它还受低位影响,百位出现1的情况是12 100-12 113,一共114个,等于低位数字 (113)+1。
情况3:如果百位上数字大于1(即为2-9),则百位上可能出现1的次数也仅由更高位决定,比如12 213,则 百位出现1的情况是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300个 ,并且等于更高位数字+1(12+1)×当前位数(100)。
四、程序源码
#include <iostream.h> long int Find(int n) { long int count=0; //1的个数 long int F=1; //当前位 long int LNum=0; //低位数字 long int CNum=0; //当前数字 long int HNum=0; //高位数字 if(n<=0) { return 0; } while(n/F!=0) { LNum=n-(n/F)*F; //低位数字 CNum=(n/F)%10; //当前数字 HNum=n/(F*10); //高位数字 if(CNum==0) { count +=HNum*F; } else if(CNum==1) { count+=HNum*F+LNum+1; } else { count+=(HNum+1)*F; } F*=10; } return count; } int main() { long int n; cout<<"请输入一个数n(n>0):"; cin>>n; cout<<"1的个数为:"<<Find(n)<<endl; return 0; }
五、运行截图
六、实验总结
通过本次课堂联系,让我学习到了在遇到类似问题的时候应该先举例运算,并在计算过程中找出规律,根据找出的规律
通过代码来实现题目的要求。
相关文章推荐
- 3月17号周二课堂练习:四则运算三
- 课堂练习-买书价格最低
- 软件工程课堂练习-最高折扣
- 课堂练习4
- 课堂练习-电梯调度
- 课堂练习-找水王
- 课堂练习----水王程序
- 课堂练习之检测水军(拓展)
- 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
- 课堂练习——找1
- 课堂练习_找出1的个数
- 课堂练习之博客园用户体验
- 20155309南皓芯 第六周 课堂测试及书上练习
- 课堂练习2: 从命令行输入5个整数,放入一整型数组,然后打印输出。要求: 如果输入数据不为整数,要捕获输入不匹配异常,显示“请输入整数”;如果输入数据多余5个,捕获数组越界异常,显示“请输入5个整数”
- python第三节课堂练习:统计一句单词
- 上机练习题——接口 课堂练习2
- 课堂练习之十字链表
- CCNP课堂练习一:连接两个不同的路由器
- 课堂练习—hash
- 软件构架 课堂练习一