將乙個數分解成多個加數相加的形式

2021-10-08 23:08:07 字數 1337 閱讀 4239

看到這個命題首先想到的是暴力遞迴,除了這個辦法看起來好像沒有更好的辦法。。。不知道是不是。

舉個栗子:比如 4

首先想到的是1+1+1+1,來抽象一下,數字n,它的所有組合情況一定是這樣的:

1+f(n-1)

2+f(n-2)

3+f(n-3)

n-1+f(1)

哈哈,有沒有看到一絲規律呢,其實遞迴退出條件都被你看到了。

再往下寫乙個  f(n-1) = 1+f(n-1-1) 

哈哈哈,彷彿看到了亮閃閃的for迴圈,你說對了,每次遞迴初始值都是從1開始的,終止條件呢,當然是本層棧待求變數的最大值嘍,是這樣嗎?

實踐一下就知道了

#include #include #include using namespace std;

#define min(x,y) (((x)<(y))?(x):(y))

void writebuffer(const int * buffer)

printf("%d\n", *buffer);

}void _splitnum(int * buffer, const int x, const size_t pos)

else }

}void splitnum(const int x)

}int main()

4

1+1+1+1

1+1+2

1+2+1

1+32+1+1

2+23+1

我們發現有重複的組合,觀察一下重複序列的特點,1+1+2 、   2+1+1 什麼區別,乙個序列後面的值大於前面的值唄,另乙個後面的值,都小於第乙個值唄,推廣一下,還都符合規律,像乙個什麼辦法控制一下呢,將 x 的值控制成序列前面所有值的最小值不就行了嗎,min(x,buffer[pos]),完美解決重複的問題

#include #include #include using namespace std;

#define min(x,y) (((x)<(y))?(x):(y))

void writebuffer(const int * buffer)

printf("%d\n", *buffer);

}void _splitnum(int * buffer, const int x, const size_t pos)

else }

}void splitnum(const int x)

}int main()

4

1+1+1+1

2+1+1

2+23+1

讀者細細把玩一下吧,遞迴還是很有趣的。

將乙個偶數分解成質數之和

目標 將乙個偶數,分解成質數之和。public class disintegrateevennumber 判斷乙個正整數是否是質數 public static boolean isprimenum int inputnum else return result 判斷是否是乙個偶數 public st...

將乙個數m分解成n個數之和的所有可能

週末的時候,師兄提了乙個小學生的題目,然後這個題目自我估計,反正我是做不出來的。然後師兄想用計算機的方法,寫個 看能不能把這個問題解答出來,於是就找了一下我這個菜雞一起討論 題目就不貼了,樓主感覺小學生過的好難啊 最後師兄表示他在乙個問題上卡住了,簡化之後問題是這樣的 有n個數,他們之和為m,這些組...

將乙個整數 M 分解成 K 個數之和的方法數

記錄乙個遇見的問題,關於將乙個整數 m 分解成 k 個數之和 1,首先 k 個數不能有 0 如果有 0 也很簡單啊,將問題進一步分解成 將整數 m 分解成 k 1 個數之和 以此類推一直到分解成 1 個數之和,所有相加就可以得出數量 2,對於順序顛倒不算,比如將 3 分解成 2 個數之和,可以分成 ...