從1到n整數中1出現的次數

2021-06-29 07:14:55 字數 1420 閱讀 3888

輸入乙個整數n,求從1到n這n個數的十進位制表示中1出現的次數。例如:輸入12,從1到12這些整數中包含1的數字有1,10,11(這裡出現了2次)和12, 一共出現了5次。

有2種解法:

第一種:窮舉法,從1到n,每個數判斷一次,判斷的方法是每位除以10,若餘數為1,這說明改位含1。複雜度為o(n*logn)。**如下:

1

int numberof1(unsigned intn)2

10 n = n / 10;11

}12return

number ;13}

14int numberof1between1andn(int

n)15

21return

number ;

22 }

第二種:遞迴法,先求最高位出現1的個數,然後去掉最高位遞迴的求剩下位數中1出現的個數。時間複雜度是o(logn)。**如下:

1

int powerbase10(unsigned int n)//

n位數,每一位從0~9任選乙個數,一共有多少種情況28

return

result ;9}

10int numberof1(const

char*strn)

1116

int first = *strn - '0'

;17 unsigned int length = static_castint>(strlen(strn));

18if (length == 1 && first == 0)19

22if (length == 1 && first > 0)23

26int numfirstdigit = 0 ; //

最高位為1的個數

27if (first > 1)28

31else

if (first == 1)32

35int numotherdigits = first * (length - 1) * powerbase10(length - 2);//

非最高位為1的個數

3637

int numrecursive = numberof1(strn + 1);//

遞迴求少一位數的情況

3839

return numfirstdigit + numotherdigits + numrecursive ;//

返回一共的個數40}

41int numberof1between1andn(int

n)42

47char strn[50

];48 sprintf(strn,"

%d" ,n);//

將整數轉換成字串

49return

numberof1(strn);

5051 }

整數中1出現的次數(從1到n整數中1出現的次數)

求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。include u...

整數中1出現的次數(從1到n整數中1出現的次數)

時間限制 1秒 空間限制 32768k 題目描述 include using namespace std class solution 求之前的length 1位中含乙個數 int base1 0 int base2 1 for int i 0 i1 i cout cout cout 求從base2...

整數中1出現的次數(從1到n整數中1出現的次數)

求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。演算法一 暴力累加...