輸入乙個整數n,求從1到n這n個數的十進位制表示中1出現的次數。例如:輸入12,從1到12這些整數中包含1的數字有1,10,11(這裡出現了2次)和12, 一共出現了5次。
有2種解法:
第一種:窮舉法,從1到n,每個數判斷一次,判斷的方法是每位除以10,若餘數為1,這說明改位含1。複雜度為o(n*logn)。**如下:
1int numberof1(unsigned intn)2
10 n = n / 10;11
}12return
number ;13}
14int numberof1between1andn(int
n)15
21return
number ;
22 }
第二種:遞迴法,先求最高位出現1的個數,然後去掉最高位遞迴的求剩下位數中1出現的個數。時間複雜度是o(logn)。**如下:
1int 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出現的次數。演算法一 暴力累加...