程式設計之美中的一道題:
題目:輸入乙個整數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)。
例子我是按照各位做統計的,某位左側代表這個迴圈體出現了幾次,右側代表這個體中1出現了多少遍,如:
30143:
由於3>1,則個位上出現1的次數為(3014+1)*1
由於4>1,則十位上出現1的次數為(301+1)*10
由於1=1,則百位上出現1次數為(30+0)*100+(43+1)
由於0<1,則千位上出現1次數為(3+0)*1000
注:以百位為例,百位出現1為100~199,*100的意思為單步出現了100~199,100次,*30是因為出現了30次100~199,+(43+1)是因為左後一次301**不完整導致。
這樣做的數學思路很清楚但是程式設計並不方便,因為需要知道某一位的數有得知道他前後的數值(每次把乙個數差分成三段不方便遞迴實現和判定終止)livelylittlefish網友提供的方法,就是把規律查分到按大小集合,確實方便程式設計
**如下:
[html]view plain
copy
// 1count.cpp : 定義控制台應用程式的入口點。
//
#include "stdafx.h"
#include <
iostream
>
#include <
windows.h
>
using namespace std;
longlong sum1s( ulonglong n )
ifactor *= 10;
} return icount;
} int main()
程式設計之美中的一道題
int numberof1(int n)
else if(curbits == 1)
else
base *= 10;
if(highbits == 0)
break;
} return number; }
這個演算法速度很快:
整數中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出現的次數。演算法一 暴力累加...