寻找正整数中1的个数

一、实验题目

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

要求:

1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;

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

二、设计思路

首先分析规律

F(3)=1

F(13)=2+4=6

F(19)=2+10=12

F(23)=3+10

F(33)=4+10

F(93)=10+10=20

F(123)=24+20+13=57

设N = abcde ,其中abcde分别为十进制中各位上的数字。

如果要计算百位上1出现的次数,它要受到3方面的影响:百位上的数字,百位一下(低位)上的数字,百位一上(高位)上的数字。

如果百位上数字为0,百位上可能出现1的次数由更高位决定。比 如:12013,则可以知道百位出现1的情况可能 是:100~199,1100~1199,2100~2199,,.........,11100~11199,一共1200个。可以看出是由更高位数字 (12)决定,并且等于更高位数字(12)乘以 当前位数(100)。

如果百位上数字为1,百位上可能出现1的次数不仅受更高位影响还受低 位影响。比如:12113,则可以知道百位受高位影响出现的情况 是:100~199,1100~1199,2100~2199,,.........,11100~11199,一共1200个。和上面情况一样,并且等 于更高位数字(12)乘以 当前位数(100)。但同时它还受低位影响,百位出现1的情况是:12100~12113,一共114个,等于低位数字(113)+1。

如果百位上数字大于1(2~9),则百位上出现1的情况仅由更高位决 定,比如12213,则百位出现1的情况 是:100~199,1100~1199,2100~2199,...........,11100~11199,12100~12199,一共有 1300个,并且等于更高位数字+1(12+1)乘以当前位数(100)。

三、源代码

// 1的个数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
using namespace std;

int main()
{
    int a;//输入的正整数
    int count=0; //计算1的个数
    int i=1; //低位数字
    int m=0; //当前位数字
    int n=0;//高位数字
    int b=0;
    cout<<"请输入正整数:"<<endl;
    cin>>a;
    while(a/i!= 0)
    {
        m=a-(a/i)*i;
        n=(a/i) % 10;
        b=a/(i*10);
        if(n==0)
        {
            count+=b*i;
        }
        else if(n==1)
        {
            count+=b*i+m+1;
        }
        else
        {
            count+=(b+1)*i;
        }
        i*=10;
    }
    cout<<"该正整数1的个数为:"<<count<<endl;
    return 0;
}

四、运行结果

五、心得体会

  这次的实验我基本上都是参考的编程之美上面的,但是我把它的思路以及代码已经完全看懂了。主要是我在编写这个题目的时候虽然思路找到了,但是在写程序的时候不会写,所以我就参考了一下别人的程序。

时间: 2024-10-10 06:48:28

寻找正整数中1的个数的相关文章

统计重1到n的正整数中1的个数

转:http://blog.csdn.net/sjf0115/article/details/8600599 问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数. 例如:N= 2,写下1,2.这样只出现了1个“1”. N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12.这样,1的个数是5. 问题一: 写一个函数f(N),返回1到N之间出现1的个数,比如f(12)= 5. 解法一: 让我们首先想到的一个方

9.5位操作(三)——给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数

/** * 功能:给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数. * (一个略大一个略小.) */ 三种方法: 方法一:蛮力法 方法二:位操作法 <span style="white-space:pre"> </span>/** * 方法:位操作法 * 思路:获取后一个较大的数 * 1)计算c0和c1.c1是拖尾1的个数,c0是紧邻拖尾1的作坊一连串0的个数. * 2)将最右边.非拖尾0变为1,其位置为p=c1+c0. * 3)将位p

寻找数列中第K大的数

版权所有 未经允许 请勿擅自商用 转载请指明出处 最早看到这个问题是在那本Mark写的数据结构与算法分析的书中引论部分,当时就是瞅瞅,到了最近,在实际应用中,我需要查找一些列的数中第k大的数时,我才重新回顾品味这个问题.现在,实际问题中,我还暂时没有解决问题,但是这段思考过程很有意思,在这里给大家品味下. 具体的问题有点复杂,在这里就不赘述了,暂且将这个问题形式化的描述如下: 给定一个有限无序数列记做{an},从这个数列中找出第k大的数. 输入:数列{an},k 输出:第k大的数 首先,有个最简

寻找全排列的下一个数(字典序算法实现)

给出一个正整数,找出这个正整数所有数字全排列的下一个数.通俗的说就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数.举例: 如果输入:12345,则返回12354 如果输入:12354,则返回12435 如果输入:12435,则返回12453 思路: 字典序算法: 从后向前查看逆序区,找到逆序区域的前一位,作为数字置换的边界: 逆序区是指:数字大小(从左到右)排序一定会是从大到小. 所以从右往左找,第一个右边值大于左边值的位置,那么右边这个位置就是逆序区的起始点. 从右向左,

[华为机试练习题]45.求某二进制数中1的个数

题目 描述: 题目标题: 求某二进制数中1的个数. 给定一个unsigned int型的正整数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 详细描述: 原型: int GetCount(unsigned int num) 输入参数: num 给定的正整数 输出参数(指针指向的内存区域保证有效): 无 返回值: 返回1的个数 举例: 输入13,则对应的二进制是1101,那么1的个数为3个.则:返回3. 练习阶段: 初级 代码 /*--------------------

快速寻找满足条件的两个数

时间:2014.07.17 地点:基地 ------------------------------------------------------------------------------------- 一.问题描述 给定一个数组,要求快速查找出其中的两个值,他们的和为一个给定的值. 比如给定数组:1 4 5 6 8  9,和给定值9,我们能找出4+5=9为所要的数值 ------------------------------------------------------------

每天一道算法题:数字二进制形式中1的个数

题目:请实现一个函数,属于一个整数,输出该数二进制表示中1的个数,例如把9表示成二进制是1001,有2位为1.因此如果输入9,该函数输出2. 可能的死循环陷阱 看完题目,相信大家很快就能想到一个解题思路:先判断整数二进制表示中最右边的一位是否为1,接着把输入的整数右移一位,此时原来处于从右边起的第二位被移动至最右边了,再判断是不是1,这样每次移动一位,直到这个整数变成0,即能够得到整数二进制表示形式中1的个数,而现在问题变为如何判断数字的最后一位为1,其实这个也很简单,只需要将数字与1做与运算,

Acdream1084 寒假安排 求n!中v因子个数

题目链接:点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Others) SubmitStatistic Next Problem Problem Description 寒假又快要到了,不过对于lzx来说,头疼的事又来了,因为众多的后宫都指望着能和lzx约会呢,lzx得安排好计划才行. 假设lzx的后宫团有n个人,寒假共有m天,而每天只能跟一位后宫MM约会,并且由于后宫

使用正则表达式寻找字符串中出现了几个[***]样式的字符串

使用正则表达式寻找字符串中出现了几个[***]样式的字符串 源码如下: - (NSUInteger)analyseRX:(NSString *)string withPatternString:(NSString *)patternString { // \\[[^\\]]+\\] 用以匹配字符串中所出现的 [*] 的个数 // <[^>]+> 用以匹配字符串中所出现的 <*> 的个数 if (string == nil) { return 0; } // 正则表达式 NSR