02.找乙個最小的自然數x,使它等於不同的兩對自然數的三次冪之和,即使得:
x=a*a*a+b*b*b=c*c*c+d*d*d
其中a,b,c,d都是自然數,且有a!=c和a!=d
解: 問題要找的解是兩個自然數對,以自然數對為解的候選者,如程式能這樣列舉解的候選者,使列舉出來的自然數對的三次冪之和構成乙個不減的序列,則當發現兩個自然數對的三次冪之和相等時,這兩對自然數就是問題的解。將這種思想寫成抽象演算法描述如下:
while(x!=min);
printf("%d=%d^3+%d^3=%d^3+%d^3/n",x,i0,j0,i1,j1);
} 問題已轉化成如何按上述要求逐一自然數對。
為了尋找產生候選者規則的線索,將問題簡化為找乙個最小的自然數x,使它等於不同的兩對自然數的平方之和。下面列出部分兩個自然數的平方之和的數表s,其中:
s[i][j]=i*i+j*j
從上面的s表查得:
50=1*1+7*7=5*5+5*5
65=1*1+8*8=4*4+7*7
所以50是兩對自然 平方和的最小者。要尋找的產生候選者的規則就是要尋找乙個方法,使列舉產生的候選者(自然數對)的平方和構成以下數列:
2 5 8 10 13 ... 45 50 50
仔細考查表中s[i][j]與i和j,不難發現有以下性質:
1) s[i][j]>s[i][k],對於所有的i,當j>k
2) s[i][j]>s[k][j],對於所有的j,當i>k
3)s[i][j]=s[j][i]
因問題將自然數對(i,j)和(j,i)視為同乙個自然數對,所以只需考慮i>=j的情況,性質1)說明對於表中的每一行,應從左到右逐個考查,且沒有必要儲存一整行的候選者供選擇,一行只要儲存乙個已足夠。當某行的當前候選者已被確認不是解時,則可生成該行的下乙個候選者,等候被考慮。
由以上分析,可用下面的兩個一維陣列表示當前正在考慮的狀態:
int s[?],j[?];
其中?意指數組的大小還未確定。陣列j的成份j[k]表示s表中的第k行當前待考慮的列號。所以,s和j有關係:
s[k]=k*k*k+j[k]*j[k]*j[k]
將以上分析結果反映到找解方法中,原先的找解演算法可改寫成如下形式:
i=1; /*最初候選者在第一行*/
do while(s[i]!=min);
printf("%d=%d^3+%d^3=%d^3+%d^3/n",min,i0,j0,i,j[i]);
} 按上述演算法編寫程式還有兩處不足,需進一步確定或調整:一是為個數不確定的陣列s和j送初值;另乙個是個數不確定的候選者中選正式候選者。由性持,由性質2),引入當前考慮的行的範圍,最大行ih和最小行il,其中ih是指有j[k]為1的最小下標k,因為當前還不可能在ih行之後選到最小的s[i],所以置初值和選最小元可侷限於k<=ih的s[k]中進行。另外,當j[i]=i時,因對s表的考查只限於它的左下角,所以對該行的進一步考查應放棄。利用這個事實,程式可引入il表示s表的當前行範圍的下界。於是置初值、尋找侷限於s表的il 行到 ih行之間。每當j[i]=i時,il增1;每當j[i]=1時,ih增1,並同時設定s[ih]和j[ih]的初值。
再次把上述思想反映到演算法中,找解演算法又可改寫成如下形式:
演算法--找乙個最小的自然數x,使它等於不同的兩對自然 的三次冪之和
if(j[i]==i)il++; /*調整il*/
else
/*以下確定新的i,使得s[i]=min(s[il],...s[ih])*/
i=il;
for(k=il+1;k<=ih;k++)
if(s[k]
#define n 50
void main()
if(j[i]==i) il++;
else
i=il;
for(k=il+1;k<=ih;k++)
if(s[k]
}while(s[i]!=min&&ih!=n);
if(s[i]==min)
printf("%d=%d^3+%d^3=%d^3+%d^3/n",min,i0,j0,i,j[i]);
else printf("the %d is too **all./n",n);
} 程式執行結果如下:
1729=10^3+9^3=12^3+1^3
C 委託機制應用例解
事件與委託似乎很難以理解,這是因為它們的使用方式與常用的編碼有很大的差別,例如通常編寫的都是同步 呼叫乙個型別的方法,會即刻出現方法執行的結果,這是符合邏輯的。但在某些情況中,同步 未必滿足需求,拿公共汽車來打個比方,如果交通管制中心希望每一輛公車到達乙個站點時都傳送給自己乙個訊號以便自己能夠隨時掌...
標C程式設計基礎02
scanf函式可以從鍵盤上讀取資料並記錄到變數中。為了使用這個函式也需要在檔案開頭使用如下的預處理指令 include scanf函式使用的時候所需要的初始資料和printf函式非常類似。它同樣也支援多種佔位符。char型別可以表示256個不同的整數,在我們的計算機上是從 128到127。這種型別的...
C語言程式設計筆記 02
c語言的基本格式如下 include int main void 說明 首先要建立乙個.c的空檔案,利用命令touch name.c建立 要定義乙個main的主函式,主函式下定義輸出,printf括號內需要雙引號隔開,句末需要返回0,每一句結尾都要用分號代表結束 n代表換行 例題 需要輸出下面的資訊...