4月28号周二课堂练习:求“1”的个数

一、题目要求

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

要求:

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

2、在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

二、设计思路

(1)一位数时

    f(0)=0;f(1)=1;f(2-9)=1;

  (2)二位数时

    f(10)=1+(0+1)=2;

    f(11)=(1+1)+(1+1)=4;

    f(12)=(1+1)+(2+1)=5;

    f(13)=(1+1)+(3+1)=6;

    f(23)=(2+1)+10=13;

    f(33)=(3+1)+10=14;

    f(93)=(9+1)+10=20;

  (3)三位数时

    f(123)=个位出现的1数+十位出现的1数+百位出现的1数

  (4)N = abcde时

    以c位为例

    if(c==0)  num=ab*100;

    if(c==1)  num=ab*100+de+1;

    if(c>=2)  num=(ab+1)*100

三、源程序

#include<iostream>
#include<math.h>
using namespace std;

int Count1Num(int Digit)
{
	int figure=1;//标记计数1的位数(1为个位,10为十位)
	int curOfDigit=0;//当前位数数字
	int lowerOfDigit=0;//较低位数字大小(可为多位)
	int higherOfDigit=0;//较高位数字大小
	int count=0;
	while(Digit/figure!=0)
	{
		//获取数字
		curOfDigit=(Digit/figure)%10;
		lowerOfDigit=Digit-(Digit/figure*figure);
		higherOfDigit=Digit/(figure*10);
		if(Digit<=0)
			return 0;
		if(0==curOfDigit)//当前数字为0时计数
		{
			count+=higherOfDigit*figure;
		}
		else if(1==curOfDigit)//当前数字为1时计数
		{
			count+=higherOfDigit*figure+lowerOfDigit+1;
		}
		else
		{
			count+=(higherOfDigit+1)*figure;
		}
		figure=figure*10;//数字左移一位
	}
	return count;
}
void main()
{
	int Digit;
	int max=0;
	while((cout<<"请输入要测试的数值(输入-1结束测试):"<<endl)&&(cin>>Digit))
	{
		if(Digit==-1)
			break;
		cout<<"1到"<<Digit<<"包含的1个数:"<<Count1Num(Digit)<<endl;
	}
}

四、运行截图

五、实验总结

题目的难点主要是在于寻找“1”出现的规律,然后根据找到的贵写出相应的算法。题目不算难,但是规律还是很难找的。

时间: 2024-10-28 00:21:24

4月28号周二课堂练习:求“1”的个数的相关文章

3月31号周二课堂练习:结对开发----求二维数组组成的矩阵中子矩阵的最大值二

一.题目要求 1.1输入一个二维整形数组,数组里有正数也有负数. 1.2二维数组首尾相接,象个一条首尾相接带子一样. 1.3数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.4求所有子数组的和的最大值.要求时间复杂度为O(n). 二.结对要求 2.1两人结对完成编程任务. 2.2一人主要负责程序分析,代码编程. 2.3一人负责代码复审和代码测试计划. 2.4发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三.设计过程 上次已经算过二维数组中

3月10号周二课堂练习:四则运算二

一.题目新的要求 1.题目避免重复: 2.可定制(数量/打印方式): 3.可以控制下列参数: 是否有乘除法.是否有括号. 数值范围.加减有无负数.除法有无余数.否支持分数 (真分数, 假分数, …).是否支持小数 (精确到多少位).打印中每行的间隔可调整: 二.设计思想(将自己上次上课时的设计思想进行稍微的修改) 1.判断两次随机数是否相同    使用函数srand()保证两个随机数不同 2.多加入一个变量,来控制题目数量 3.在每一个switch选择的语句,进行选择判断  3.1选择是否有乘除

4月14号周二课堂练习:买书最优问题

一.问题提出 书店针对<哈利波特>系列书籍进行促销活动,一共5卷,用编号0.1.2.3.4表示,单独一卷售价8元, 具体折扣如下所示: 本数                   折扣 2                       5% 3                       10% 4                       20% 5                       25% 二.题目要求 1.根据购买的卷数以及本数,会对应不同折扣规则情况.单数一本书只会对应一个折扣

4月21号周二课堂练习:找水王

一.题目要求 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半.如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二.设计思路 论坛中有多少帖子,有多少个ID都是不清楚的.我们采用类似于消消乐的方法进行处理,具体方法如下:将所有的帖子进行遍历,比较两个帖子的ID.如果两个帖子的ID相同,则将两个帖子丢弃.

3月24号周二课堂练习:结对开发----返回一个整数数组中最大子数组的和二

一.题目要求 1.1要求程序必须能处理1000 个元素: 1.2每个元素是int32 类型的: 1.3输入一个整形数组,数组里有正数也有负数. 1.4数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.5求所有子数组的和的最大值.要求时间复杂度为O(n). 二.源代码 #include<iostream> #include<time.h> #include<conio.h> #define N 100000 using namespace std; v

4月7号周二课堂练习:NABC

团队项目——7-magic 分析特点:游戏简单容易上手 NABC分析: N(needs需求)现在存在的很多游戏操作比较,游戏规则也比较繁琐,用户很难或者不愿意去玩操作难度比较大的游戏,容易上手的游戏比较有吸引力.现有的七巧板游戏可玩性很小,游戏难度很小,没有挑战性,用户没有挑战的快感和乐趣.我们的游戏恰恰解决了这个问题. A (Approach 做法)7-magic游戏上手很简单,毕竟七巧板都玩过,就算没有玩过,稍微了解一下游戏规则就可以上手玩了.上手容易但是如果想过关,或者得更高的分数确实很难

3月10号周二课堂练习:关于自动生成四则运算题目的程序的延伸

对题目要求进行初步的分析: 1.判断两次随机数是否相同    将产生的题目保存(循环)下来,然后将结果进行(循环)比较. 2.多加入一个变量Num,来控制题目数量 3.在每一个switch选择的语句,进行选择判断  3.1选择是否有乘除法,  3.2是否有括号 判断是否加减乘除是否都存在,加减在算式中的位置,然后进行选择是否添加括号 3.3数值范围 主要控制随机数产生器模余的大小(如a=rand()%n,n可以取任意值)    3.4加减有无负数 比较减数和被减数的大小  3.5除法有无余数 将

7月28号=》296页-300页

13.3.5 正则表达式 正则表达式所支持的合法字符 字符 解释 x(x'可代表任何合法的字符) 字符x \0mnn 八进制数0mnn所表示的字符 \xhh 十六进制值0xhh所表示的字符 \uhhhh 十六进制值0xhhhh所表示的Unicode字符 \t 制表符('\u0009') \n 新行(换行) 符 ('\u000A') \r 回车符('\u000D') \f 换页符('\u000C') \a 报警(bell)符('\u0007') \e Escape符('\u001B') \cx x

3月27号周五课堂练习:结对开发----返回一个整数数组中最大子数组的和三

一.题目要求 1.1输入一个整形数组,数组里有正数也有负数. 1.2数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.3如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 1.4同时返回最大子数组的位置. 1.5求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 三.源代码 #include<iostream> #include<time.h> #include<conio