題目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;
}
