Divisor - 演算法筆記
文章推薦指數: 80 %
把最大公因數想成是疊積木就簡單多了。
求出了差值後,原問題便縮小成了跟原問題類似的問題。
也就是說,輾轉相除法 ...
Divisor
使用乘法,湊得給定數字。
給你一個數,例如12。
哪些數字相乘,可以得到12呢?
例如1×12=12、2×6=12、3×4=12。
使用乘法,分解給定數字。
湊合與分解,一體兩面。
12可以分解成哪些數字相乘呢?
例如12=1×12、12=2×6、12=3×4。
一個數字分解成的數字叫做「因數」。
DivisorGeneration:TrialDivisionAlgorithm
DivisorGeneration
「因數生成」。
一個數字的所有因數,通通列出來。
0:012...5:1510:12510
1:16:123611:111
2:127:1712:1234612
3:138:124813:113
4:1249:13914:12714
一個數字的所有因數
「試除法」。
嘗試每個數字作為因數。
時間複雜度O(n)。
voiddivisor_generation(intn)
{
for(intd=1;d<=n;d++)
if(n%d==0)
cout<
幾何學之父原來跟數論也扯得上關係。
由於兩數必定是由最大公因數的整數倍所組合而成,故其差值也必定由最大公因數的整數倍所組合而成,不管兩數如何輾轉相減、輾轉求餘數,其得到的值都會是最大公因數的倍數。
把最大公因數想成是疊積木就簡單多了。
求出了差值後,原問題便縮小成了跟原問題類似的問題。
也就是說,輾轉相除法採取了Divide-and-ConquerMethod。
時間複雜度O(log(min(a,b))),其中整數運算預設為O(1)。
原理是FibonacciSequence,詳情請見離散數學教科書。
迴圈版本。
//令a大b小,比較容易思考。
intgcd(inta,intb)
{
//大小不對,交換位置。
if(a>1,b>>1)<<1;
elseif((a&1)==0)
returngcd(a>>1,b);
elseif((b&1)==0)
returngcd(a,b>>1);
else
returngcd(min(a,b),abs(a-b));
}
intgcd(inta,intb)
{
intc=0; //記錄gcd乘二乘了幾次
while(a&&b) //如果ab都是正數
//如果ab都是偶數:a/=2,b/=2,gcd乘二
if(!(a&1)&&!(b&1))
a>>=1,b>>=1,c++;
//如果a是偶數、b是奇數:a/=2
elseif(!(a&1)) a>>=1;
//如果a是奇數、b是偶數:b/=2
elseif(!(b&1)) b>>=1;
//如果ab都是奇數:判斷ab大小,求出餘數。
elseif(a>b) a-=b;
else b-=a;
//不為零的數,乘上c個2,就是gcd。
returnmax(a,b)<
延伸文章資訊
- 1每一個因數和標準分解式之間有沒有什麼關係存在?? 「想一 ...
Thinking Mathematically ; 日期. 主題. 作者(提供者) ; 8/1/1999, 正因數的秘密?! 數學王子. 網友tseng的同學來信和數學王子討論以下的題目,我認為...
- 2找因數
列出因數. 輸入一個數字,系統會找出該數字的所有因數:
- 3Divisor - 演算法筆記
把最大公因數想成是疊積木就簡單多了。 求出了差值後,原問題便縮小成了跟原問題類似的問題。也就是說,輾轉相除法 ...
- 4題目- 找出n的所有因數- C++與演算法
輸出一列,由小到大依序輸出n的所有因數。 input. 100. output. 1 2 4 5 10 20 25 50 100. 提示.
- 5五年級課外數學~求因數個數公式 - 每日頭條
先上答案:18的因數個數為6個,分別為1,2,3,6,9,18。今天王老師幫大家梳理一下,怎麼求一個數的因數個數。