求整数范围中1的个数

一、解法

1 public int NumberOf1Between1AndN_Solution(int n) {
2             int ones = 0;
3             for (long m = 1; m <= n; m *= 10){
4                 long a = n/m, b = n%m;
5                 //对应位置>=2的时候              //对应位置为1的时候
6                 ones += (a+8)/10*m +((a%10 == 1)? (b+1):0);
7             }
8             return ones;
9 }

二、思路

1、我们每次分别求个位,十位,百位,千位等等对应的1的个数。

2、举个例子求1-315中1的个数

2-1 首先当m=1时,a = 315,b = 0,这个时候我们求的是个位为1的个数。

此时个位的位置为5,大于2,我们用(a+8)/10来求得个位为1的数目,

此时计算(315+8)/10等于32,表示一共有32个个位为1的整数,分别为

(1,11,21,31,41,51,61,71,81,91,

101,111,121,131,141,151,161,171,181,191,

201,211,221,231,241,251,261,271,281,291,

301,311),

然后计算当个位的位置如果为1的时候,315%10 = 5, 5==1 为false,

因此此时为0,此时个位为1一共有32个。

2-2 再计算十位为1的个数,此时m=10,n=315,a=31,b=5,

(a+8)/10等于3,3*10,表示十位为1的个数有30个,分别是

(10,11,12,13,14,15,16,17,18,19,

110,111,112,113,114,115,116,117,118,119,

210,211,212,213,214,215,216,217,218,219),

然后再计算(a%10 == 1) 由于a=31,所以为true,此时代表的

十位为1的个数需要再加上(b+1)个,即6个,即十位为1的个数有

36个。

2-3 再计算百位为1的个数,此时m=100,n=315,a=3,b=15,

(a+8)/10等于1,1*100,表示百位为1的个数有100个,分别是

(100...199),再计算(a%10 == 1)为false,因此百位为1的个数

一共有100个

2-4 将个位,10位,百位加在一起一共有32+36+100 = 168个。

时间: 2024-11-08 21:29:41

求整数范围中1的个数的相关文章

数组-10. 求整数序列中出现次数最多的数

数组-10. 求整数序列中出现次数最多的数(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3

7-6 求整数序列中出现次数最多的数 (15 分)

7-6 求整数序列中出现次数最多的数 (15 分) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3 0 3 2 输出样例: 3 4 s = input().split()[1:] count_max = 0 for i in set(s

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

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

判欧拉回路或求一个图中欧拉图的个数

判欧拉图两个条件首先联通,其次度全部为欧度.那么就很easy了. 题目:hdoj1878 求一个图中欧拉图的个数. 首先通过连通性求出各个子图,然后求子图中奇数度的个数cnt,cnt/2为欧拉图的个数.若子图没有奇数度,则为一个欧拉回路. 题目:hdoj3018Ant Trip 注意这个题目中可能出现孤立点,不算入欧拉图中. AC代码: include include include include include include include include include include

数组-10. 求整数序列中出现次数最多的数(15)

本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3 0 3 2 输出样例: 3 4 #include <stdio.h> #define N 1000 int comp(const void *p, const void *

C++求n!中0的个数

/*#include <iostream> using namespace std; //2014!里面0的个数. int Giral(int x) { int i=0; int j=0; while(x) { int sum = x; if(x%2==0) { while(x%2==0) { x/=2; i++; } } if(x%5==0) { while(x%5==0) { x/=5; j++; } } sum--; x=sum; } return i>j?j:i; } int m

求二进制数中1的个数

对于一个字节(8bit)的无符号整型变量,求二进制表示中1的个数. 解法一: 除二求余法,如10100011 除以2 得01010001余1.当除二结果为1时,二进制中1的个数会减少一个,例, 01010001除以2得00101000余1  .当能整除2时,二进制中1的个数不变,例,00101000除以2得00010100. public static int getOneNumber(int num){ int onenum=0; while(num!=0){ if (num%2==1) {

整数中1 的个数

问题 求整数中1的个数 原理 一个数n若不为0,从数的最低为到最高位,第一个为1 的位记为 i ,则减去 1 之后,改为变为0,i 右边的所有位都变为1,因此 n & (n-1)可得 n中剩余比 i 更高位序 的 部分 ,循环此操作,则可得 1 的计数. 代码 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int n,s,counter = 0; 7 cout << " Plea

求二进制数中1的个数(编程之美)

求二进制数中1的个数 继京东618店庆时买的<编程之美>这本书,翻了翻,发现里面的题还是挺有意思的,看起来我们觉得很简单的题目,解法却有很多很多种,真是一个比一个巧妙,于是,决定记录一下. 书中的题目如下 对于一个字节(8bit)的无符号数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能高. 就像书中给我们说的一样,我们一般人可能想到的解决方法如下 int countOne(int n){ int count=0; while(n){ if(n%2==1){ cou