計(jì)算機(jī)等級(jí)考試C語(yǔ)言程序設(shè)計(jì)例解(03)

字號(hào):

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]
    解:
     利用上一問(wèn)題的求解思想,上一問(wèn)題在正方形平面下三角區(qū)內(nèi)找解,本題在正立方體的下三角棱內(nèi)找解。記i為三角棱體的平面,j為某平面的行,k為某行上的列。當(dāng)前考察的下三角棱體的范圍由最上平面至最下平面控制;對(duì)應(yīng)每個(gè)平面的下三角區(qū)域,在每個(gè)下三角區(qū)域內(nèi)當(dāng)前待考查的行可由行的下界和上界控制,每個(gè)有效行上的候選列由其當(dāng)前列來(lái)表示。因此有如下解法:
    算法---找一個(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(在對(duì)角線上找到候選者)
     當(dāng)前平在的行的變化下界增1;
     else
     調(diào)整當(dāng)前平面當(dāng)前行的列號(hào)值;
     }
     在當(dāng)前最上平面至當(dāng)前最下平面范圍內(nèi)尋找最小值的候選者;
     }while(兩候選者對(duì)應(yīng)的值不相等);
     輸出解;
    }
    因每個(gè)平面有行變化的下界和上界,程序分別用兩個(gè)一維數(shù)組來(lái)存貯;每個(gè)平面的每行都有一個(gè)當(dāng)前列,程序用一個(gè)二維數(shù)組來(lái)存貯;為避免反復(fù)計(jì)算一個(gè)整數(shù)的三次冪,另引入一個(gè)一維數(shù)組,對(duì)應(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è)定行的變化范圍和對(duì)應(yīng)列號(hào);當(dāng)前最上平面的最下角點(diǎn)找到候選者時(shí),最上平面向下進(jìn)一層;當(dāng)在第一列找到候選者時(shí),當(dāng)前平面的行的上界增,并為新的行設(shè)定初始列號(hào);當(dāng)在某行的對(duì)角線上找到候選者時(shí),該行不應(yīng)該再被考慮,當(dāng)前平面的行的下界增1;其它情況,當(dāng)前行的下一列將會(huì)被考慮,為該行調(diào)整當(dāng)前列。在調(diào)整當(dāng)前平面的行的下界和上界時(shí),應(yīng)不能超過(guò)當(dāng)前平面號(hào)。為在三角棱體的當(dāng)前有效平面內(nèi)找最小值的候選者,先假定最上平面的最小行的當(dāng)前列為下一個(gè)候選者,然后自最上平面至最下平面,每個(gè)平面自最小行至行,尋找最小值所在平面號(hào)、行號(hào)和列號(hào)。