计算“1”的个数

1.设计思想

对于一个整数来说,每一位如十位、百位、千位等出现1的次数根据该位数上的数值及其低位或高位影响。当该位数上的数为0时,出现1的次数可能由高位决定,等于高位数字与当前位数相乘;当该位数上的数为1时,出现1的次数受高位和低位影响,及等于高位数字与当前位数相乘并加上低位数字再加1;当该位数上的数大于1时,出现1的次数只由高位决定,及等于高位数字加1后乘上当前位数。通过循环控制每一次的判断,当前位数不断增加。

2.源程序

#include <iostream>
using namespace std;

int f(int N)
{
    int m=0,n=1;
    int a,b,c;
    while(N/n!=0)
    {
        a=N-(N/n)*n;
        b=(N/n)%10;
        c=N/(n*10);
        if(b==0)
        {
            m+=c*n;
        }
        else if(b==1)
        {
            m+=c*n+a+1;
        }
        else
        {
            m+=(c+1)*n;
        }
        n=n*10;
    }
    return m;
}

void main()
{
    int num;
    cout<<"请输入一个十进制的整数:"<<endl;
    cin>>num;
    cout<<"从1到"<<num<<"的所有整数中,1的个数为:"<<f(num)<<endl;
}

3.结果截图

4.总结

主要是要找到规律,一开始没有很好的找到规律,当通过不断的用整数进行寻找规律,而当规律找到时,总结规律也是很重要的,分析规律进行最后的总结,用表达式进行表示,能够实现计算。

时间: 2025-01-05 17:43:24

计算“1”的个数的相关文章

hdu 1086(计算几何入门题——计算线段交点个数)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7167    Accepted Submission(s): 3480 Problem Description Ma

模板 计算1的个数

[模板]计算1的个数 1 __int64 CountOne(__int64 n) 2 { 3 __int64 count =0; 4 if (n ==0) 5 count =0; 6 else if (n >1&& n <10) 7 count =1; 8 else 9 { 10 __int64 highest = n; 11 __int64 bit =0; 12 while (highest >=10) 13 { 14 highest = highest /10; 15

C/C++ 使用宏在编译期计算可变参数个数

参考https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s 同时参考了cppformat源代码 C++是不提倡可变参数,理由不说了.但是类似printf的函数族使用起来确实很方便,我在查找printf的替代方案时无意间看到的.感慨下,微软的CString::Format确实很好用 cppformat提供类似printf的功能,但是又是类型安全的,其核心是利用C++强大的模版功能.在实现上,cppformat实现了在编译期计算可

(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(5): 计算table元素个数:table.nums

这里的函数主要用来做:计算table元素个数.参考资料为quick_cocos. 星月倾心贡献~~~ 我们先看一段代码 local tbl = { [1] = 2, [2] = 2, [3] = 3 } print( "tbl length is " .. #tbl ) 这段代码是获得tbl的长度,即元素个数. 输出: tbl length is 3 拥有三个元素,没有问题.我们注意到元素的下标是,即key值是:1, 2, 3.即tbl[1], tbl[2], tbl[3].如果,我们

hadoop输入分片计算(Map Task个数的确定)

作业从JobClient端的submitJobInternal()方法提交作业的同时,调用InputFormat接口的getSplits()方法来创建split.默认是使用InputFormat的子类FileInputFormat来计算分片,而split的默认实现为FileSplit(其父接口为InputSplit).这里要注意,split只是逻辑上的概念,并不对文件做实际的切分.一个split记录了一个Map Task要处理的文件区间,所以分片要记录其对应的文件偏移量以及长度等.每个split

字符拆分存入Map计算单词的个数

///计算从命令行输入单词的种类与个数//Map<key,Value>Key-->单词:Value-->数量

LeetCode Number of 1 Bits 计算1的个数

题意:提供一个无符号32位整型uint32_t变量,返回其二进制形式的1的个数. 思路:取出一位,就右移1位,挤掉它,循环32次,逐个判断.没难度就不解释了,可能有更好解法,等待第2次思考. 1 class Solution { 2 public: 3 int hammingWeight(uint32_t n) { 4 if(!n) return 0; 5 if(n==1) return 1; 6 7 uint32_t MASK = 1, temp=n; 8 int i, cnt = 0; 9

算法导论:计算“1”的个数

问题如下:给定一个正整数n,统计从1到n的所有整数中出现“1”的个数,如当n=12时,1,2,3,4,5,6,7,8,9,10,11,12中,共有5个“1”: 下面给出我的暴力求解方法: 1 package org.warnier.zhang.demo; 2 3 public class OneCalculator { 4 5 public int calculate(int n) { 6 int count = 0; 7 for(int i = 1; i <= n; i++){ 8 int z

JS实现计算任意一个数的各个位数的和

<script> var m = parseInt(prompt("请输入一个数")); function box(m) { var a = 0; while (m) { //循环m: a += m % 10; //计和,每次的余数相加: m = parseInt(m / 10); //取整,直到为0,退出循环: } return a; //返回a: } alert(box(m)); // 调用这个函数,输出m的各个位数的和: </script> 原文地址:ht