JAVA技巧:JAVA解決某百度之星題目

字號(hào):

題目描述:
    一個(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ě)的很粗糙,僅為興趣之作.