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)。
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)。