數學之美 用割補法實現數字a出現個數的問題

2021-09-19 06:06:47 字數 1290 閱讀 2533

題目:給定乙個整數n,計算所有小於等於n的非負整數中數字a(0<=a<=9)出現的個數

示例:輸入25178 ,5;輸出9717。

割補法示例回顧:在平面中給定乙個不規則的圖形,需求其面積。

割:在圖形內部通過連對角線或者作垂線等手段將其分割成若干個規則圖形的面積來分別進行求積運算。

補:通過補充,將原不規則圖形放在乙個規則的矩形或其它規則圖形的內部,然後減去其外部補充圖形的面積。

解題思路:在這裡面預設末尾都是0為規則數字(因為此時可以用排列組合原理直接算出某個數字出現的次數)運用割補法的思想,以25178,5為例。

割:首先把0到25178分為0到19999和20000到25178兩部分(由於2不等於5,這部分可以等價於0到5178),然後以此類推迴圈「降次」求每個位數中數字2出現次數。

補:依需求而補,千位數為5等於要找的數字,在算千位中數字5出現的次數時可以先將其補充為26000進行計算(此時,26000也可以等價於6000),然後在減去其多補充的數字5出現的次數。

割法的**如下:

public int countdigitone1(int n,int b) 

else if (firstonenum < b)

else //獲取最高位數出現數字b的次數

int otheronenum = first * (len - 1) * (tmp / 10);//固定最高位數字,其它位數字中數字b出現的次數

return firstonenum + otheronenum + countdigitone1(n % tmp,b);//通過遞迴實現每次都把最高位降1,然後進行累加

}

補法的**如下:

public int countdigitone2(int n,int b) 

else if ((n / tmp) < b)

else //獲取最高位數出現數字b的次數

for (int i = len - 1; i > 0; i--)

else if (y < b)

else

}return sum;

}

在這裡還需要乙個獲得數字n的位數的演算法

private int getlenofnum(int n) 

return len;

}//得到數字n的位數

以上就是用割補法的思想解決這個題目的全部解答,如有描述不當之處,還望讀者能夠指出。數學思想博大精深,此僅為冰山一角,數學思想與計算機的融合更為奇妙,願讀者與筆者一同學習,共同進步。

用matlab感受數學之美

相比於之前的課程,這個學期,應用數學開了繁多的課程,運籌 陣列 matlab這幾門的實驗課更是增添了很多課程設計 課程 要寫。再配上實變 復變 常微分,覺得這個學期簡直完美 括弧微笑臉 近期,在寫matlab小課程設計,打算從分形入手。想到n多年前,在微博上截過一張圖,沒想到如今派上了用場。於是,今...

數學之美11 拼音輸入法的數學原理

1.輸入法與編碼 a.對漢字的編碼分為兩個部分 i.對拼音的編碼 ii.對消除歧義的編碼 b.拼音輸入法的優勢 i.不需要專門的學習 ii.輸入自然,不會中斷思維,即找每個鍵的時間短 iii.編碼長,有資訊冗餘,容錯性好 2.輸入乙個漢字需要敲多少個鍵 夏農第一定理 a.夏農第一定理 對於乙個資訊,...

用python實現冒泡法排序(數字公升序)

自己照著書本依葫蘆畫瓢的,有不對的話請多指正 冒泡法如果有n個元素,則需要執行n 1次掃瞄 第一次掃瞄需要進行n 1次比較 假設有5個元素,則共進行 4 3 2 1 10 次比較 coding gbk num 0data while num 1 num int input please enter ...