在從1到n的正數中1出現的次數

2021-04-24 01:06:27 字數 1120 閱讀 1758

題目:輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。

例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。

我的思路是計算每一位上1會出現在哪些數字中。

建乙個陣列a[n]放置每一位,從個位到最高位,0~n, 這裡n = 4。

a[0]=5,  a[1]=0, a[2]=1, a[3]=4, a[4] = 2. 我們就說第0位是5,第4位是2.

第4位出現1,a[4]>1。則在10000到19999這些數內,也就是出現10^4次.

第3位出現1,a[3]>1。 把24105看成兩部分:2    4105,第一部分可能是0~2(也就是0,1,2),第二部分是1000~1999。

所有第4位出現1可能的情況是:

第一部分為0,就是1000~1999。

第一部分為1,11000~11999。

第一部分為2,21000~21999。

所以第4位出現1的次數為3 * 10^3。

第2位出現1,a[2] = 1。24   105,因為a[2] = 1,第一部分要分成兩種情況考慮。

第一部分0~23,第二部分100~199。

第一部分23,第二部分100~105。不能超過105,比如24 106就大於24105了。

所以第2位出現1的次數為(24 * 10^2 )+ (105-100 + 1).

第1位出現1,a[1] = 0。241    05。

第一部分0~240,第二部分10~19。

第一部分不能為241了。

所以第1位出現1的次數為241 * 10^1 .

第0位出現1,a[0] = 5。2410    5。

第一部分0~2410,第二部分1。

所以第0位出現1的次數為2411 * 10^0 .

所有加一下就是1出現的次數了。

第i位出現1,a[i]>1, 就直接(第一部分+1)* 10^i。a[i]=1或0,就把 第一部分相等的那種情況另外再考慮。

這道題還可以擴充套件為數2的個數,或其他數字的個數。區別就是在a[i]<=2(或其他)就要另外考慮了。

在從1到n的正數中1出現的次數

int count1in1ton int n return n int countnumber1 int n return count 程式設計之美上的方法 大體的思路是這樣的 假設n abcde,這裡a,b,c,d,e分別是十進位制數n的各個位數上的數字。如 果要計算百位上出現1的次數,它會受到三...

求在從1到n的正數中1出現的次數

題目 輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。問題描述 給定乙個十進位制正整數n,寫下從1開始,到n的所有整數,然後數一下其中出現的所有 1 的個數。例如 n 2,寫下1,2。這樣只出...

面試題32 在從1到n的正數中1出現的次數

1 方法一 class solution1 n n 10 return cnt int numberof1between1andn solution int n return cnt 2 方法二 使用遞迴的思路 class solution2 else if 1 len first digit 0 ...