題目1373:整數中1出現的次數(從1到n整數中1出現的次數)


題目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(0<=a,b<=1,000,000,000)。

 

輸出:

對應每個測試案例,輸出a和b之間1出現的次數。

 

樣例輸入:
0 5
1 13
21 55
31 99
樣例輸出:
1
6
4
7

 

 

主要思路:計算數字每一位出現1的次數,並相加,得到該數字中1出現的次數。

例如:1304中,個位出現1的次數,是131次,即1304/10 + 1 = 131;十位出現1的次數 (1304/100)*10  = 130;百位出現1的次數 (1304/1000 + 1)*100 = 200 ;千位出現1的次數( 1304/10000)*1000+1+1304-int(1304/1000)*1000 = 305 總計766;

總結一下,計算數字n中1的個數,得到以下規律:從個位開始,對每一位數字進行處理,先計算對10取余的余數rem,計算除以10以后的數字tmp,如果余數為0,則該位為1的數字個數為 base*tmp ;余數為1,該位為1的數字個數為n-int(n/base)*base +1 + tmp*base;base在每計算完一位數字后,乘以10,代碼如下:

 

 

#include <stdio.h>

void swap(int *a, int *b)
{
	int tmp = *b;
	*b = *a ;
	*a = tmp;
}
int getNum1(int n)
{
	int num =0;
	
	int tmp,rem,base;
	base =1;tmp = n;
	
	while(tmp)
	{
		rem = tmp%10;
		tmp = tmp/10;
		if(rem == 0)
		{
			num+=base*tmp;
		}
		else if(rem == 1)
		{
			num  = num + (n - int(n/base)*base +1 + tmp*base);
		}
		else
			num += (tmp+1)*base;
		base *= 10;
	}
	
	return num;
}
int main()
{
	int low ,high;
	while(scanf("%d%d",&low,&high)!=EOF)
	{
		if(low <0 || high <0)
			continue;
		if(low > high)
			swap(&low,&high);
		if(low ==0)
		{
			printf("%d\n",getNum1(high));
			continue;
		}
		printf("%d\n",(getNum1(high)- getNum1(low-1)));
	}
	
	
	
	return 0;
}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM