课堂练习之找“1”的个数

一、题目

给定一个十进制的正整数,写下从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 #include <iostream.h>
 2
 3 long int Find(int n)
 4 {
 5     long int count=0;      //1的个数
 6     long int F=1;       //当前位
 7     long int LNum=0;    //低位数字
 8     long int CNum=0;    //当前数字
 9     long int HNum=0;    //高位数字
10     if(n<=0)
11     {
12         return 0;
13     }
14     while(n/F!=0)
15     {
16         LNum=n-(n/F)*F;   //低位数字
17         CNum=(n/F)%10;    //当前数字
18         HNum=n/(F*10);    //高位数字
19         if(CNum==0)
20         {
21             count +=HNum*F;
22         }
23         else if(CNum==1)
24         {
25             count+=HNum*F+LNum+1;
26         }
27         else
28         {
29             count+=(HNum+1)*F;
30         }
31         F*=10;
32     }
33     return count;
34 }
35
36 int main()
37 {
38     long int n;
39     cout<<"请输入一个数n(n>0):";
40     cin>>n;
41     cout<<"1的个数为:"<<Find(n)<<endl;
42     return 0;
43 }

五、运行截图

六、实验总结

通过本次课堂联系,让我学习到了在遇到类似问题的时候应该先举例运算,并在计算过程中找出规律,根据找出的规律

通过代码来实现题目的要求。

时间: 2024-12-11 02:16:20

课堂练习之找“1”的个数的相关文章

Java-寻找矩阵连通域个数

给定一个矩阵,寻找连通域个数:前后左右相同为连通 ex: 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 输出2 利用深度搜索思路: 1 public static int getCount(int[][] A) { 2 int result = 0; 3 for (int i = 0; i < A.length; i++) { 4 for (int j = 0; j < A[0].length; j++) { 5 if (A[i][j] == 1) { 6 result++;

[面试题]在数组中找出3个数使得它们和为0

给定一个数组S,试找出3个数a, b, c,使得a+b+c=0.也即从集合中找出所有的和为0的3个数. 例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, 0, 1)和(-1, 2, -1).注意(-1,1,0)与(-1,0,1)算同一个解,所以不用重复考虑. 当然该例子集合的解也可以写成:(0, 1, -1)和(2, -1, -1). 参考了:http://blog.csdn.net/wangran51/article/details/8858398,他给

有两个变量a和b,不用“if”、“? :”、“switch”或其他判断语句,找出两个数中比较大的

1.问题 There are two int variables: a and b, don't use "if"."? :"."switch" or other judgement statement, find out the biggest one of the two numbers. (有两个变量a和b,不用"if"."? :"."switch"或其他判断语句,找出两个数中比较

【c语言】给一组数,只有一个数只出现了一次,其他所有数都是成对出现的。找出这个数

// 给一组数,只有一个数只出现了一次,其他所有数都是成对出现的.找出这个数 #include <stdio.h> int find_one(int arr[], int len) { int i = 0; int ret = 0; for (; i < len; ++i) { ret ^= arr[i]; } return ret; } int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; printf("%d\n",

leetcode 1: 找出两个数相加等于给定数 two sum

问题描述 对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引.(从1开始) Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target,

课堂练习_找出1的个数

一.思路想法 在找出1的个数,首先不能用穷举的方法.在此程序中,我借鉴了同学的方法,将各个位 上的数值的1的个数相加,最后得出最终的个数. 二.代码 #include "stdafx.h" #include <stdio.h> int Count(int num) { int count,mul,num1,num2,num3; count=0; mul=1; num1=num2=num3=0; while(num/mul) { num1=num-(num/mul)*mul;

课堂练习之找“水王”

一.题目要求 现有一个灌水论坛,信息学院的学生都喜欢在上面交流灌水.传说在论坛上有一个“水王”,它不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目已超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者ID在其中,请设计算法快速找到这个传说中的“水王”. 二.设计思路 设计思路还没想明白..只能看一下同学的思路了.. 程序的设计思路大体就是,首先设2个变量,将第一个数暂时给shuiwang这个变量并且和下一个数比较,如果相同则用一个X变量自加一,

找1的个数

课堂练习——得出“1”的个数 2015-05-03 20:30 by 奔波儿灞, 5 阅读, 0 评论, 收藏, 编辑 题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 一.设计思路 首先,此题可以用从1到N遍历一遍的方法来解决.即输入一个数除以10取余数,如果余数等于1则计数加1,否则

课堂练习之找出所有的“1”

一.题目 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数. 例如 f(12) = 5. 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.设计思想 对于这道题目,输入一个正整数,返回从1开始到这个数之间出现过的所有“1”的个数,我的思路是这样的, 1.先要将这个数是几位数得出来: 2.用一个for 循环将数字中德每一位存到数组中,以备后面使用: 3.因为要得到总