1、題目描述
求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。
2、**1
2.1、思路:任何資料範圍分成兩個部分。以3258為例,首先將1-3258的範圍分成兩段:(1):1-258和259-3258;
(2):先看259到3258的部分;先看最高位取1 次數為1000-1999,後面三位無論取什麼都行,注意這裡是只計了最高位1的次數,因最高位是1*10*10*10=1000,再看259-3258的剩餘的三位中,任何一位取,則另外兩位可隨取,最高位可以取到最高數值,因此後面三位中1的次數為:3*3(三位取1)*10*10(另外2位可隨便取0到9)=900,因此後面3位取1的次數為900,則一共259-3258取1的次數和為1900;
(3)最後再來計算1-258的1的個數,繼續迭代就行。因此整體上是乙個迭代函式,在函式內再分段。每次迭代,最高位向後移動一位。
–整體上需要注意:分段後的,整數個資料的資料段中1的計算是有規律的。即:a***可以分成1-***和(***+1)-a***,第二個資料段的資料個數是整數,而且第二個資料段的1的次數的計數是有規律可循的,先計算最高位1的次數,最後計算後面位的1出現的次數。
2.2、**:
#include
#include
using namespace std;
int power(int n)
return
sum;
}int numberof1(char* str)
class
solution
};int main()
2.3注意:
(1)整數向後取數的方法:轉化成字串的方法。比如1258最高位向後取一位構成新數。利用sprintf函式把資料轉化成字串再操作。這種思想需要經常注意。
(2)強調這種分段的思想,注意這裡的計算是所有數中1出現的1次數,不是有1的資料的個數,比如111,1出現3次,就算3次。
整數中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出現的次數。演算法一 暴力累加...