實
現函式int func(unsigned n),其中n為正整數,返回從1到n(包含1和n)之間出現的1的個數,如
func(13)=6,func(9)=1。(注意:不能將整數轉化為字串)
這是網上以為兄弟的分析:
分析:對於數n,可以把它分成三段,高位段most,當前位cur,低位段least,每一段分別為乙個整數。對於乙個有digit位的數,假設當前位是左數第i位,則設乙個臨時變數tmp為10的digit-i次方,即比least多一位的最小整數。如數123456,為6位數,digit=6,設當前為左起第3位,則i=3,most=12,cur=3,
least=456,tmp=1000。
如果當前位大於1,則從1到n間出現在當前位出現的1的個數是most*tmp+tmp;如果等於1,則是
most*tmp+least+1;如果小於,則為most*tmp。
實現:int func(unsigned n)
else if (cur == 1) }
return count;}
我從新解釋一下,思想都差不多:
對於乙個數字中的任何第k位出現1的次數,我們將之分為兩個階段:
1. 其高位(>k的那些為,k從低位開始計數)有多大的概率使得k位出現1
2. 每次第k為出現1之後,這個1能保持多長時間。
舉個例子:
n=3243,k=2,即十位上的那個數字m[k]=4
1. 顯然,十位上出現1的次數是 n%100,即:如果我讓十位上固定是1,然後百位和千位上數字從0增長可以增長到多少?顯然,增長到32,所以,高位能使得k=2的位置上出現n%100次1,請注意:還有一次是要根據m[k]來確定的;如果m[k]>=1,則是n%100+1,否則就是n%100了。而第二位是對100mod,也就是第k位就是pow(10,k) mod n
2. 一旦第二位出現了1,能保持多長時間呢?顯然,如果十位是1,那麼10,11,12,。。。,19都能保持住,能保持10次。wait,是不是總是如此,不是的,如果本來第二位是大於1,當然沒有問題,比如25,這個時候,10到19都小於25,所以沒有問題,十位上的1出現10次;但是如果十位上是1,比如17,這樣就不能出現10次了;只能出現10,11,。。。。17,也就是8次。
基於此,給出**實現:
int func1(unsigned int n)
return count;
}
統計所有0到n之間所有含有數字1的數字和
實現函式int func unsigned n 其中n為正整數,返回從1到n 包含1和n 之間出現的1的個數,如 func 13 6,func 9 1。注意 不能將整數轉化為字串 分析 這個問題可以分解為 對於乙個有digit位的數,可以統計其每個位上出現1的次數,遍歷每個位,累計的次數即為出現1的...
求0到n之間所有數字中1的個數和
計算4 000 000 000以內的最大的那個f n n的值,函式f的功能是統計0到n之間所有數字中1的個數和。這道題需要解決2個問題,求數字1的個數和以及求最大的f n n。一 子問題1 求數字1的個數和 如果n是一位數,可以確定f n 1。如果是二位數,如果 n 13,那麼從 1 到 13 的所...
輸出1到最大n位數之間的所有數
比如 n 2 那麼從1一直輸出到99 分析 直接輸出,遇到大數時肯定有問題,比如n 100,儲存100位的資料型別不存在。可以利用陣列來儲存大數,比如n 100,可以開闢個陣列 char a 101 思路一 模擬現實中的技術方式,逢九進一 參考 include include using names...