十进制数中1的个数

一、题目:

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12)  = 5。2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

二、思路:

  这道题偏向数学的推理,其根本在于找规律,而规律则在于将所给的数进行分解,分成个十百千等位数的个体,再从每个中寻找规律。通过整理,每一位有多少个1只与其前后两位有关系,具体算法程序如下:

三、源程序

 1 #include<iostream.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     int num;
 6     int count=0;
 7     int flog=1;
 8     int low=0;
 9     int now=0;
10     int high=0;
11     cout<<"请输入数字:   ";
12     cin>>num;
13     while (num/flog!=0)
14     {
15         low=num-(num/flog)*flog;
16         now=(num/flog)%10;
17         high=num/(flog*10);
18         switch (now)
19         {
20         case 0:
21             count=count+high*flog;
22             break;
23         case 1:
24             count=count+high*flog+low+1;
25             break;
26         default:
27             count=count+(high+1)*flog;
28             break;
29         }
30         flog=flog*10;
31     }
32     cout<<num<<"中出现数字1的个数为:"<<count<<endl;
33     return 0;
34 }

四:实验截图

五、实验总结

这节课所学最大的地方就是找规律。越来越感觉计算机其实就是机械化的数学。在寻找模型、组合算法的过程中其实就是列方程、解题的过程。通过对数学模型的整理、来实现程序的实现。

时间: 2024-11-05 20:38:42

十进制数中1的个数的相关文章

找出十进制数中出现的&#39;&#39;一&#39;&#39;的个数

一.题目要求: 给定一个十进制的正整数,写下从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

一个组数中只有两个数只出现了一次,其他所有数都是成对出现的,找出这两个数

原题:给一组数,只有两个数只出现了一次,其他所有数都是成对出现的.怎么找出这两个数. 编写函数实现. 对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,经过分析发现异或全部数组的数所得到的数为整个数组中两个只出现一次数异或的结果先对所有的元素进行异或.可以通过将结果转换为二进制,在移位二进制数中的第一个1,然后根据这个1的判断条件将整个数组分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数. 例如:数组中的元素为下面这些数: 0000   

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

如何从一堆数中选出若干个数,使其和等于给定的数?

如题,比如有一堆数:13,2,4,2,4,8,7,8,6 要从中挑选出若干个数,使得它们的和等于32,挑选出来的数是:20,6,4,2 我是使用“试探”法来解这个题目,思路如下: 先对数进行排序:13,8,8,7,6,4,4,2,2 选出最大的数字,以及不大于目标数字后续数字,于是我挑选到了13,8,8,其和是29,如果这个时候再挑选7的话就会超过32,所以就跳过,尝试在后面找到合适的数字,找到4,加上仍然大于32,再接着找到2,这次好了,加起来是31. 再次向后面寻找小的数字的时候,发现没有合

找出一组数中只出现一次的两个数,其他所有数都是成对出现的

题目: 给一组数,只有两个数只出现了一次,其他所有数都是成对出现的.怎么找出这两个数.编写函数实现. 题目分析: 上次介绍了,对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,但是对于找出两个出现一次的数应该怎么解决呢?先对所有的元素进行异或,则结果为两个出现一次的数的异或结果,然后将结果转换为二进制,找出二进制数中的第一个1,然后根据这个1的判断条件进行分组,分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数. 例如:数组中的元素为下面这

【C语言】输入一个整数,输出该数二进制表示中1的个数(三种方法)

输入一个整数,输出该数二进制表示中1的个数.如输入32,输出1. 代码实现: 方法1:与运算 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOneNumber(unsigned int num) {     int numberofOne = 0;     while (num)     {         num = num & (num - 1);         

巧妙使用Contains()方法查找一个数是否在某堆数中

问题:要判断用户输入的一个数,或者是程序里方法的一个参数的值,或者是一个变量的值是否在某堆数中. 简洁写法:把这堆数放在list中,使用list的Contains()方法检查list是否包含这个数,取反. 代码如下: static void Main(string[] args) { Console.WriteLine("请输入一个数字:"); string input=Console.ReadLine(); if (!(new List<string>() { "

输入的数转化为二进制序列,并统计序列中1的个数

★输入的数转化为二进制序列,并统计序列中1的个数 描述:普通的模除取余后数直接除二的办法易于理解,但是对于输入的数只限于正数和零,对于负数则不适应,所以采用与后移位的方法以此来扩大数的输入范围. #include<stdio.h> int main() { int m,b,c,i; int count = 0; char a[32]; printf("请输入一个数:\n"); scanf("%d", &m); for (i = 0; i <

程序设计-----字符串中删除连续空格,只保留一个空格 数中删除连续相同的数,只保留一个数

一.问题描述 输入一个字符串,注意是可以带空格的,我们所要做的是如果字符之间有很多个连续的空格,我们只需要保留一个空格,并输出显示. 有一个类似的问题,是将一个数中连续相同的数删除掉,只保留其中一个数,如3456667,转化为34567.这个问题与字符串的问题大体上是一致的, 只是字符串限定了只有连续的空格需要处理,连续的其他字符是可以接受的,如abbbc是满足条件的,而a    bbb     ccc则要转换为a bbb ccc. 二.问题分析 在书写程序的过程中,首先的思路是以空间换取时间,