整數拆分:即把乙個給定的正整數拆分為若干個連續正整數之和
例如: 將輸入乙個整數15,可以拆分為:
15 = 1+2+3+4+5
15 = 4+5+6
15=7+8
分析:
由題可知,拆分的起始項i不會超過該數n的一半減一(1~(n-1)/2),累加項不會超過該數的一半加一(i~(n+1)/2)
這裡可以作為迴圈的條件,在j迴圈中若s(總和) >= n(原整數),則退出,否則繼續求和。
**實現:
/**
* 拆分連續正整數之和
* @author evan_qb
* */
public class demo2 else
break;}}
}} system.out.println("共有" + count + "個解!!!");
input.close();
}}
執行結果如下:
演算法優化:
優化要點:
累加項個數優化:
設正整數的個數為k,k的最大值為t
1+2+...+ t = t*(t+1)/2 = n,即t < sqrt(2t)
設起始值m的連續k項(2<= k < t)之和為n
m + (m+1) + ... + (m+k-1) = k*(2*m + k -1)/2 = n
推出:
m = (2*n/k-k+1)/2
在迴圈中:
正整數的個數k的範圍為: 2 ~ t,如果2*n不能被k整除,或(2*n/k-k+1)不能被2整除,說明此時m不是整數,則返回。
否則為正整數 m =(2*n/k-k+1)/2,即為解
**實現:
/**
* 拆分數優化版
*/public void test1()
//設定起始項為start
long start = (2*n/k - k + 1)/2;
//滿足的條件的個數
count++;
//列印出來
if (k == 2) else
}system.out.println("一共有" + count + "個解");
input.close();
}
執行結果:
連續正整數之和
題目描述 乙個正整數有可能可以被表示為n n 2 個連續正整數之和,如 15 1 2 3 4 5 15 4 5 6 15 7 8 請編寫程式,根據輸入的任何乙個正整數,找出符合這種要求的所有連續正整數序列。輸入資料 乙個正整數,以命令列引數的形式提供給程式。輸出資料 在標準輸出上列印出符合題目描述的...
3276 連續正整數之和
單點時限 2.0 sec 記憶體限制 256 mb 有些正整數可以表示為 n n 1 個連續正整數的和,如 15 1 2 3 4 5 4 5 6 7 8 給定乙個正整數 n,判斷其是否可以表示為一組連續正整數的和,輸出符合條件的解的組數。輸入格式 第 1 行 乙個整數 t 1 t 10 為問題數。第...
將乙個整數劃分為多個正整數之和
整數劃分問題是將乙個正整數n拆分成一組數連加並等於n的形式,顯然這組數中最大加數不大於n。令n為需要劃分的整數,m為劃分後的最大整數。例如將6劃分為最大加數為6的劃分形式如下 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 2 2,2 2 1 1,2 1 1 1 1 1 1 1 ...