題目:輸入乙個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。
例如輸入12,從1到12這些整數中包含1 的數字有1,10,11和12,1一共出現了5次。
問題描述:給定乙個十進位制正整數n,寫下從1開始,到n的所有整數,然後數一下其中出現的所有"1"的個數。例如:
n = 2,寫下1,2。這樣只出現了1個"1"。
n = 12,寫下1,2,……,12,這樣有5個"1"。
寫乙個函式f(n),返回1到n之間出現的"1"的個數,比如f(12) = 5。
假設n = abcde,這裡a,b,c,d,e分別是十進位制數n的各個數字上的數字。如果要計算百位上出現1
的次數,將受3方面因素影響:百位上的數字,百位以下(低位)的數字,百位(更高位)以上的數字。
如果百位上的數字為0,則可以知道百位上可能出現1的次數由更高位決定,比如12 013,則可以知
道百位出現1的情況可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200個。也就是
由更高位數字(12) 決定,並且等於更高位數字(12)×當前位數(100)。
如果百位上的數字為1,則可以知道,百位上可能出現1的次數不僅受更高位影響,還受低位影響,
也就是由更高位和低位共同決定。例如12 113, 受更高位影響,百位出現1的情況是100-199,1 100
-1 199,……,11 100-11 199,一共有1 200個,和上面第一種情況一樣,等於更高位數字(12)×當
前位數(100)。但它還受低位影響,百位出現1的情況是12 100-12 113,一共114個,等於低位數字
(113)+1。
如果百位上數字大於1(即為2-9),則百位上可能出現1的次數也僅由更高位決定,比如12 213,則
百位出現1的情況是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300個
,並且等於更高位數字+1(12+1)×當前位數(100)。
**如下:
// 1count.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include using namespace std;
longlong sum1s( ulonglong n )
ifactor *= 10;
} return icount;
}int main()
{ cout << sum1s(123)<
這個演算法速度很快:
結果如下:
在從1到n的正數中1出現的次數
題目 輸入乙個整數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 ...
在從1到n的正數中1出現的次數
int count1in1ton int n return n int countnumber1 int n return count 程式設計之美上的方法 大體的思路是這樣的 假設n abcde,這裡a,b,c,d,e分別是十進位制數n的各個位數上的數字。如 果要計算百位上出現1的次數,它會受到三...
資料結構練習(45)在從1到n的正數中1出現的次數
思路 這題是程式設計之美上面的一道題,同時也是十分考察觀察力的一道題,對於數字30142 1.對於個位上面的2有2 1,所以個位上面1出現的次數為 3014 1 1 如果字首為0,所以要加1 2.對於十位上面的4有4 1,同樣有十位上面1出現的次數為 301 1 10 3.對於百位上面的1有1 1,...