題目描述:
一個(gè)正整數(shù)有可能可以被表示為n(n>=2)個(gè)連續(xù)正整數(shù)之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
請(qǐng)編寫(xiě)程序,根據(jù)輸入的任何一個(gè)正整數(shù),找出符合這種要求的所有連續(xù)正整數(shù)序列。
輸入數(shù)據(jù):
一個(gè)正整數(shù),以命令行參數(shù)的形式提供給程序。
輸出數(shù)據(jù):
在標(biāo)準(zhǔn)輸出上打印出符合題目描述的全部正整數(shù)序列,每行一個(gè)序列,每個(gè)序列都從該序列的最小正
整數(shù)開(kāi)始、以從小到大的順序打印。如果結(jié)果有多個(gè)序列,按各序列的最小正整數(shù)的大小從小到大打印各
序列。此外,序列不允許重復(fù),序列內(nèi)的整數(shù)用一個(gè)空格分隔。如果沒(méi)有符合要求的序列,輸出“NONE” 。
例如,對(duì)于15,其輸出結(jié)果是:
1 2 3 4 5
4 5 6
7 8
對(duì)于16,其輸出結(jié)果是:
NONE
評(píng)分標(biāo)準(zhǔn):
程序輸出結(jié)果是否正確?! ?BR> 算法分析:
由于本題不考慮算法的性能,只以結(jié)果是否正確為評(píng)判標(biāo)準(zhǔn),所以可以用最容易的窮舉法來(lái)做。
假設(shè)輸入的值為m,一個(gè)整數(shù)被表示為n(n>=2)個(gè)連續(xù)整數(shù)之和,那么這n個(gè)數(shù)也不能超過(guò)m/2+1。所
以我們可以令max=m/2+1,由max往下找。令current為當(dāng)前結(jié)果,讓current=max+(max-1)+……,當(dāng)
current恰好為m時(shí),表示找到這樣的一個(gè)序列,我們打印這個(gè)序列;考試,大提示若current>m時(shí),則表示找不到這個(gè)
序列,考慮從max-1往下加。如此循環(huán)往復(fù)。
程序設(shè)計(jì)如下:
public class Test
{
public void print(int n)
{
boolean find=false;//保存是否能找到這樣的序列
int max=n/2+1; //保存可能存在的序列的數(shù)
for(int i=max;i>0;i--)//從數(shù)往下窮舉取值取值
{
int current=i;//保存當(dāng)前結(jié)果
for(int j=i-1;j>0;j--)
{
if(current {
current+=j; //如果當(dāng)前結(jié)果小于n則繼續(xù)加
}
if(current==n) //如果當(dāng)前結(jié)果與n相等,則表示已經(jīng)找到這樣的
序列,打印這個(gè)序列
{
find=true;
for(int k=j;k<=i;k++)
{
System.out.print(k+" ");
}
System.out.println();
break;
}
else if(current>n)//如果當(dāng)前結(jié)果大于n,則表示以i為數(shù)的序
列不可能存在
{
break;
}
}
}
if(find==false)
{
System.out.println("NONE");//假如沒(méi)找到則打印"NONE"
}
}
public static void main(String args[])
{
new Test().print(15);
}
}
隨便寫(xiě)寫(xiě),寫(xiě)的很粗糙,僅為興趣之作.
一個(gè)正整數(shù)有可能可以被表示為n(n>=2)個(gè)連續(xù)正整數(shù)之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
請(qǐng)編寫(xiě)程序,根據(jù)輸入的任何一個(gè)正整數(shù),找出符合這種要求的所有連續(xù)正整數(shù)序列。
輸入數(shù)據(jù):
一個(gè)正整數(shù),以命令行參數(shù)的形式提供給程序。
輸出數(shù)據(jù):
在標(biāo)準(zhǔn)輸出上打印出符合題目描述的全部正整數(shù)序列,每行一個(gè)序列,每個(gè)序列都從該序列的最小正
整數(shù)開(kāi)始、以從小到大的順序打印。如果結(jié)果有多個(gè)序列,按各序列的最小正整數(shù)的大小從小到大打印各
序列。此外,序列不允許重復(fù),序列內(nèi)的整數(shù)用一個(gè)空格分隔。如果沒(méi)有符合要求的序列,輸出“NONE” 。
例如,對(duì)于15,其輸出結(jié)果是:
1 2 3 4 5
4 5 6
7 8
對(duì)于16,其輸出結(jié)果是:
NONE
評(píng)分標(biāo)準(zhǔn):
程序輸出結(jié)果是否正確?! ?BR> 算法分析:
由于本題不考慮算法的性能,只以結(jié)果是否正確為評(píng)判標(biāo)準(zhǔn),所以可以用最容易的窮舉法來(lái)做。
假設(shè)輸入的值為m,一個(gè)整數(shù)被表示為n(n>=2)個(gè)連續(xù)整數(shù)之和,那么這n個(gè)數(shù)也不能超過(guò)m/2+1。所
以我們可以令max=m/2+1,由max往下找。令current為當(dāng)前結(jié)果,讓current=max+(max-1)+……,當(dāng)
current恰好為m時(shí),表示找到這樣的一個(gè)序列,我們打印這個(gè)序列;考試,大提示若current>m時(shí),則表示找不到這個(gè)
序列,考慮從max-1往下加。如此循環(huán)往復(fù)。
程序設(shè)計(jì)如下:
public class Test
{
public void print(int n)
{
boolean find=false;//保存是否能找到這樣的序列
int max=n/2+1; //保存可能存在的序列的數(shù)
for(int i=max;i>0;i--)//從數(shù)往下窮舉取值取值
{
int current=i;//保存當(dāng)前結(jié)果
for(int j=i-1;j>0;j--)
{
if(current
current+=j; //如果當(dāng)前結(jié)果小于n則繼續(xù)加
}
if(current==n) //如果當(dāng)前結(jié)果與n相等,則表示已經(jīng)找到這樣的
序列,打印這個(gè)序列
{
find=true;
for(int k=j;k<=i;k++)
{
System.out.print(k+" ");
}
System.out.println();
break;
}
else if(current>n)//如果當(dāng)前結(jié)果大于n,則表示以i為數(shù)的序
列不可能存在
{
break;
}
}
}
if(find==false)
{
System.out.println("NONE");//假如沒(méi)找到則打印"NONE"
}
}
public static void main(String args[])
{
new Test().print(15);
}
}
隨便寫(xiě)寫(xiě),寫(xiě)的很粗糙,僅為興趣之作.