C++程序設(shè)計(jì)例解(03)

字號:

03. 找一個(gè)最小的自然數(shù),使它等于不同的兩組三個(gè)自然數(shù)的三次冪之和,即找最小的x,使得:
    x=a*a*a+b*b*b+c*c*c+d*d*d+e*e*e+f*f*f
    其中,a,b,c,d,e,f都是自然數(shù),a<=b<=c<=d<=e<=f; [a,b,c]!=[d,e,f]
    解:
    利用上一問題的求解思想,上一問題在正方形平面下三角區(qū)內(nèi)找解,本題在正立方體的下三角棱內(nèi)找解。記i為三角棱體的平面,j為某平面的行,k為某行上的列。當(dāng)前考察的下三角棱體的范圍由最上平面至最下平面控制;對應(yīng)每個(gè)平面的下三角區(qū)域,在每個(gè)下三角區(qū)域內(nèi)當(dāng)前待考查的行可由行的下界和上界控制,每個(gè)有效行上的候選列由其當(dāng)前列來表示。因此有如下解法:
    算法---找一個(gè)最小的自然數(shù)x,使它等于不同的兩組三個(gè)自然數(shù)的三次冪之和
    {
    以三角棱體的頂點(diǎn)為最初候選者;
    為最初尋找平面設(shè)定行的變化范圍和列的初值;
    do
    {
    保存上一個(gè)候選者;
    if(當(dāng)前候選者在最下平面)
    {
    尋找平面范圍的最下平面向下進(jìn)一層;
    為新平面設(shè)定行的變化范圍;
    }
    if(在最上平面最下角點(diǎn)找到候選者)
    尋找平面范圍的最上平面向下進(jìn)一層;
    else
    {
    if(在第一列找到候選者)
    {
    當(dāng)前平面的行的變化上增1;
    置當(dāng)前平面的行的列為1;
    }
    if(在對角線上找到候選者)
    當(dāng)前平在的行的變化下界增1;
    else
    調(diào)整當(dāng)前平面當(dāng)前行的列號值;
    }
    在當(dāng)前最上平面至當(dāng)前最下平面范圍內(nèi)尋找最小值的候選者;
    }while(兩候選者對應(yīng)的值不相等);
    輸出解;
    }
    因每個(gè)平面有行變化的下界和上界,程序分別用兩個(gè)一維數(shù)組來存貯;每個(gè)平面的每行都有一個(gè)當(dāng)前列,程序用一個(gè)二維數(shù)組來存貯;為避免反復(fù)計(jì)算一個(gè)整數(shù)的三次冪,另引入一個(gè)一維數(shù)組,對應(yīng)第i下標(biāo)位置存貯i*i*i。令當(dāng)前找到的候選者為i1,j1,k表示在i1平面的第j1行的k1列找到的候選者。因候選者限制在三角棱內(nèi),i1,j1,k1滿足條件:
    i1>=j1>=k1
    當(dāng)候選者在最下平面時(shí),則最下平面向下進(jìn)一層,并為新平面設(shè)定行的變化范圍和對應(yīng)列號;當(dāng)前最上平面的最下角點(diǎn)找到候選者時(shí),最上平面向下進(jìn)一層;當(dāng)在第一列找到候選者時(shí),當(dāng)前平面的行的上界增,并為新的行設(shè)定初始列號;當(dāng)在某行的對角線上找到候選者時(shí),該行不應(yīng)該再被考慮,當(dāng)前平面的行的下界增1;其它情況,當(dāng)前行的下一列將會(huì)被考慮,為該行調(diào)整當(dāng)前列。在調(diào)整當(dāng)前平面的行的下界和上界時(shí),應(yīng)不能超過當(dāng)前平面號。為在三角棱體的當(dāng)前有效平面內(nèi)找最小值的候選者,先假定最上平面的最小行的當(dāng)前列為下一個(gè)候選者,然后自最上平面至最下平面,每個(gè)平面自最小行至行,尋找最小值所在平面號、行號和列號。