這個題目的要求是:將乙個大於1的整數寫成幾個整數乘積的形式,因為任意數和1相乘,其乘積不變,故要求分解後的數不能為1。題目要求所有的排列形式,所以12=3×4和12=4×3應該視為是兩個不同的分解式,都應當輸出。例如:對於整數n=36,其所有的分解式是
36=36
36=2*18
36=18*2
36=3*12
36=12*3
36=4*9
36=9*4
36=6*6
36=2*2*9
36=2*9*2
36=9*2*2
36=2*3*6
36=2*6*3
36=3*6*2
36=3*2*6
36=6*2*3
36=6*3*2
36=3*3*4
36=3*4*3
36=4*3*3
36=2*2*3*3
36=2*3*2*3
36=2*3*3*2
36=3*2*2*3
36=3*2*3*2
36=3*3*2*2
演算法原理:
本演算法採用遞迴實現。若整數n的各個因子放在乙個棧stack中,元素個數為len,則
1. 輸出"n="各個因子相乘的形式。
2. 將陣列的最後乙個元素出棧,送入m,將m分解成2個整數m1,m2,將m1,m2入棧,此時,棧中的元素個數為len+1,遞迴呼叫函式split.
為了簡便起見,我們使用陣列模擬棧。函式split的**如下:
void split(int n,int arr, int len)
printf("\n");
for(last=arr[len-1],i=2; i<=last/2;i++)
}}
由於高度合成數的因子非常多,我們的測試**使用了前40個高度合成數做實驗。關於高度合成數的概念,請參閱見維基百科高合成數條目
完整的**如下:
#include #include void split(int n,int arr, int len)
printf("\n");
for(last=arr[len-1],i=2; i<=last/2;i++)
}}int main()
; int i,n,arr[32];
for (i=0;i
如果12=3×4和12=4×3視為是同乙個分解式,只需要輸出1個。則這個split函式應該修改如下。為了和原來的那個split區別,我們把這個函式命名為split2
void split2(int n,int arr, int len)
printf("\n");
last=arr[len-1];
sqrt_last=(int)sqrt(last*1.0);
if (len<2)
i=2;
else
i=arr[len-2];
for(;i<=sqrt_last;i++)
}}
整數N對應的所有分解組合
問題描述 某些整數能分解成若干個連續整數的和的形式,例如 15 1 2 3 4 5 15 4 5 6 15 7 8 某些整數不能分解為連續整數的和,例如 16 輸入形式 乙個整數n n 10000 輸出形式 整數n對應的所有分解組合,如果沒有任何分解組合,則輸出none。樣例輸入 樣例輸出 1 2 ...
整數的因子分解法
由算術基本定理,我們知道每乙個正整數都可以被唯一地寫成一些素數的乘積。由初等數論及其應用定理3.2可知 任意給定乙個整數n,則n要麼是乙個素數,要麼擁有乙個不超過n sqrt n 的素因子。因此,當我們依次用不超過n sqrt n 的素數2,3,5 去除n的時候,要麼,我們可以找到乙個n的素因子p ...
分解式的個數
大於1的正整數可以分解成一組因子的乘積,例如12可以分解成 12 6 2 4 3 3 4 3 2 2 2 6 2 3 2 2 2 3,共8個分解式。請設計演算法,計算指定的大於1的正整數的分解式的個數。第一行為測試用例個數n,n 100000。從第二行開始,共有n行,每行為乙個大於1的正整數m,m ...