从1到n整数中1出现的次数

要计算X出现的次数(),需统计X在每一位出现的次数。

1到10出现1次X;1到100出现10次X;1到1000出现100次X。

综上可以得出:从 1 至 10i,在它们的左数第二位(右数第 i 位)中,任意的 X 都出现了 10i1 次。

Eg:以n=21345,X=1

依次分析X在各位中出现的次数:

个位:因为21340中有2134个10,所以从1到21340,1出现了2134次;再看从21341到21345,因为1<5(这里X为1,肯定满足,当X为任意数时,应判断X<5是否成立),所以1在个位中出现的次数为2135次。

十位:因为21300中有213个100,所以从1到21300,1出现在十位的次数为213*10次,再看从21301到21345,因为4>1,所以十位出现的次数为(213+1)*10^(2-1)=2140.

同理,百位出现的次数为(21+1)*10^(3-1)=2200.

千位:因为20000中共有2个10000,所以从1到20000,1出现在千位的次数为2*1000次,再看从20001到21345,因为1==1,所以千位中肯定含有1,但不会是1000次,而是345+1=346次(因为有21000,所以要加1),所以1出现在千位的总次数为2*10^(4-1)+(345+1)=2346次。

万位:方法同上,出现的次数为(0+1)*10^(5-1)=10000.

所以:21345中1出现的次数为2135+2140+2200+2346+10000=18821次

X在第i位出现的次数的计算方法:

1、取第i位左边(高位)的数字,乘以10^(i-1),得到基本的sum

2、取第i位数字:

1)如果大于X,则结果sum+=10^(i-1).

2)如果等于X,则结果为

sum+=(第i位右边的(低位)的数字)+1

3)如果小于X,则结果就为sum

代码如下:

size_t NumberOf1Between1AndN_Solution(size_t n)
{
	char str[12] = { 0 };
	int length = strlen(_itoa(n, str, 10));//计算n的位数
	size_t countSum = 0;
	//为取第i位数字简便,所以以下采取str运算
	for (int i = length - 1; i >= 0; --i)
	{
		//取第i位左面的数字
		int tmpLeft = 0;
		for (int j = 0; j < i; ++j)
		{
			tmpLeft = tmpLeft * 10 + str[j] - ‘0‘;
		}

		countSum += tmpLeft * pow(10, length - i - 1);
		int iVal = str[i] - ‘0‘; //第i位的数字
		//如果大于X,则结果countSum+=pow(10, i).
		if (iVal > 1)
		{
			countSum += pow(10, length - i - 1);
		}
		//如果等于X,则结果为countSum+=(第i位右边的(低位)的数字)+1
		else if (iVal == 1)
		{
			int tmpRight = 0;//计算低位数字
			for (int j = i + 1; j < length; j++)
			{
				tmpRight = tmpRight * 10 + str[j] - ‘0‘;
			}
			countSum += tmpRight + 1;
		}
		//如果小于X,则结果就为countSum
	}
	return countSum;
}
时间: 2024-10-05 03:14:40

从1到n整数中1出现的次数的相关文章

1049. Counting Ones/整数中1出现的次数(从1到n整数中1出现的次数)

The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12. Input Specification: Each inp

[Jobdu] 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 输入: 输入有多组数据,每组测试数据为一行. 每一行有两个整数a,b(

整数中1出现的次数(从1到n整数中1出现的次数)

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 思路1:针对这个问题,我们可以有一个最普遍的算法,就是直接计算每一个数中的1出现的次数. public int NumberOf1Between1AndN_Solution(int n) { int count =

剑指offer(四十)之整数中1出现的次数(从1到n整数中1出现的次数)

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 代码1: <span style="color:#6600cc;">public class Solution { public int NumberOf1Between1AndN_S

n个整数中1出现的次数

整数中1出现的次数(从1到n整数中1出现的次数) (两种方法:1.规律.2暴力求解) 题目描述 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. 规律( 1 的数目) 如果第 i 位(自右向左,从1开始标号)上的数字是0,则第 i 位可能出现 1 的次数

剑指offer之【整数中1出现的次数(从1到n整数中1出现的次数)】

题目: 整数中1出现的次数(从1到n整数中1出现的次数) 链接: https://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6?tpId=13&tqId=11184&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此

剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)

题目:输入一个整数n,从1到n这n个十进制整数中1出现的次数. 思路1:对1到n中的任意一个数i对其进行求余数来判断个位是否为1,然后再求除数,判断十位是否为1.统计出1的个数.然后对1到n用一个循环将所有的数都加起来.时间复杂度为O(nlogn). 思路2:根据数字的规律来求.例如:21344这个数,我们将它分成两部分,第一部分为1345~21344.这部分我们可以先求出最高位上一出现的次数.又分为两种情况,10000~19999这种情况下最高位大于1,1出现的次数为10^4,另一种是1000

整数中1出现的次数(1~n)

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数. #include<iostream> using namespace std; int main() { int n, N, cnt = 0; scanf("%d",&N);/

《剑指offer》整数中1出现的次数(从1到n整数中1出现的次数)

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数

剑指Offer面试题32(java版):从1到n整数中1出现的次数

题目:输入一个整数n,求从1到n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11,和12,1一共出现了5次. 方法一:不考虑时间效率的解法,靠它拿到Offer有点难: 如果在面试的时候碰到这个问题,应聘者大多能想到最直观的方法,也就是累加1到n中每个整数1出现的次数.我们可疑每次通过对10求余数判断整数的个位数字是不是1.如果这个数字大于10,除以10之后再判断个位数字是不是1.基于这个思路,我们写出下面的代码: /** * 从1到n整数中1出现的