课堂练习——找1

题目要求:

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

要求:   

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 题目要求:
 2   给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
 3 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12)  = 5。
 4     2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
 5 一、设计思路
 6   通过列举法,总结函数f(N)规律如下:
 7   1.一位十进制数:当N>=1时,f(N)=1;当N=0时,f(N)= 0;
 8   2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;
 9           f(23)=个位出现1的个数+十位出现1的个数=3+10=13;
10           ......
11           f(93)=个位出现1的个数+十位出现1的个数=10+10=20;
12   3.三位十进制数:f(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=13+20+24=57;
13   4.f(abcde),计算c位上的1的个数,需要看ab、c、de的情况:
14     当c=0时,受高位影响,百位上出现1的个数为:(ab)*100
15     当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1)
16     当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100
17 程序代码
18 运行结果截图
19 总结与心得
20     本次实验的题目是找1的个数,完成时设计思路花费的时间比较长,主要是用于总结规律,对于这种偏于数学应用方面的题目,只要找到规律,那么所有问题都不再困难。这也给我们提示,在我们平时解决问题时,一定要多加思考,这样才能事半功倍。
21     

三、运行结果截图

四、总结与心得

本次实验的题目是找1的个数,完成时设计思路花费的时间比较长,主要是用于总结规律,对于这种偏于数学应用方面的题目,只要找到规律,那么所有问题都不再困难。这也给我们提示,在我们平时解决问题时,一定要多加思考,这样才能事半功倍。

时间: 2024-10-17 06:37:46

课堂练习——找1的相关文章

课堂练习--“找水王续"

设计思路: ①跟上次思路一样,将问题简化成从一个数组中找出出现次数最多的3个数. ②将“两两相消"的思路模式,变成“三一相消” ③初始化time为零,kingid为零,然后按顺序赋值,遇到跟kingid1相同的time1+1,其余两个同样:遇到跟三个都不同的所有time-1. 代码: import java.util.*; public class Findthreenum { public static void main(String[] args) { Scanner input = ne

课堂作业——找1

题目: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5: 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少? 设计思想: (解法一) 开始想到了一个最简单的方法来计算f(N),那就是从1开始遍历,直到N结束,把其中每一个数中含有“1”的个数加起来,结果就是从1到N所有“1”的个数的和.这个方法很简单,但算法的实现效率是个大问题,如果N很大,则

课堂练习——找十进制数中数字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

课堂测试-找小水王

题目:在上一次的基础上,大水王消失了,出现了三个小水王,并且他们发帖数均超过总数的1/4,要求:如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这三个小水王吗? 代码: //找小水王 lvguanghao #include <iostream> using namespace std; #define N 100 int main() { int xiaoshuiwang[3]; int ID[N], a; int num = 0; int count[

软件工程课堂练习——找出1-n中1出现的个数

题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5. 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 一.设计思想 通过归纳法,可以发现: 假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字.如果要计算百位上出现1的次数,将受3方面因素影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字.

课堂练习-找水王绪

题目:三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半.       如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码)       随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 思路: 参考

课堂练习……找水王

目前除了最简单的遍历和课堂上老师提供的,类似"对子"的方法 public class Water { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int a[]={2,3,4,4,4,4,45,1}; int b[]=new int [10]; int number=-1; int n=0; for(int i=0;i<a.leng

软件工程课堂练习找水王s

题目:发现,“超级水王”没有了.统-计结-果表-明,有3个发帖很多的ID,他们的 数目都超过了 总数目N的1/4.你能从 ID列表中快速找出他们的ID吗? 思路:关联型容器可以很方便解决,php里的array就是关联型数组,php有很多方便的排序函数,所以本次用php实现. 首先对id列表进行遍历,以id为键值对数组$result进行赋值, 如果$result[$id]没有初始化,那么这就是第一次出现,即$result[$id]=1 如果$result[$id]已经初始化,那个发帖数加1,即$r

课堂作业找水王2

找水王2: 超级水王没有了.统计结果表明,有3个发帖很多的ID ,他们的发帖数目都超过了帖子总数目N的1/4.你能从发帖ID列表中快速找出他们ID吗? 设计思想: 和上一次的思路同源,如果每次删除四个不同的ID(不管是否包含发帖数目超过总数1/4的ID),那么,在剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4,可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案. 代码实现: package test1; public class F