列印整數的所有分解式

2021-06-06 20:01:24 字數 1534 閱讀 5606

這個題目的要求是:將乙個大於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 ...