統計所有0到n之間所有含有數字1的數字和

2021-06-18 01:00:46 字數 1056 閱讀 1313

實現函式int func(unsigned n),其中n為正整數,返回從1到n(包含1和n)之間出現的1的個數,如

func(13)=6,func(9)=1。(注意:不能將整數轉化為字串)

分析:

這個問題可以分解為:對於乙個有digit位的數,可以統計其每個位上出現1的次數,遍歷每個位,累計的次數即為出現1的次數之和

對於數n,可以把它分成三段,高位段most,當前位cur,低位段least,每一段分別為乙個整數。對於乙個有digit位的數,假設當前位是左數第i位(從1開始),則設乙個臨時變數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;

如果小於1,則為most*tmp。

實現:

int func(unsigned n)

else if (cur == 1)

}return count;

}

如果可以將整數轉化成字串的話,就簡單了,只是代價比較大

int fun(const unsigned int n)

{ char str[50];

int i, j;

int num = 0;//儲存n中的個數

int len;//len為轉換後的字串的長度,也即原整數的位數

for(i=1; i<=n; ++i)

{ultoa(i, str, 10); //ultoa函式將unsigned int轉化為char *型字串

len = strlen(str);

for(j=0; j

注:char *ultoa(unsigned long value, char *string, int radix); 

功能:轉換乙個radix進製的無符號長整型數為字串

求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...

輸出1到最大n位數之間的所有數

比如 n 2 那麼從1一直輸出到99 分析 直接輸出,遇到大數時肯定有問題,比如n 100,儲存100位的資料型別不存在。可以利用陣列來儲存大數,比如n 100,可以開闢個陣列 char a 101 思路一 模擬現實中的技術方式,逢九進一 參考 include include using names...