基本演算法 拆分為連續正整數之和

2021-08-11 07:32:46 字數 1470 閱讀 7545

整數拆分:即把乙個給定的正整數拆分為若干個連續正整數之和

例如: 將輸入乙個整數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 ...