考慮方程式:a^3 + b^3 = c^3 + d^3
其中:“^”表示乘方。a、b、c、d是互不相同的小於30的正整數。
這個方程有很多解。比如:
a = 1,b=12,c=9,d=10 就是一個解。因為:1的立方加12的立方等於1729,而9的立方加10的立方也等於1729。
當然,a=12,b=1,c=9,d=10 顯然也是解。
如果不計abcd交換次序的情況,這算同一個解。
你的任務是:找到所有小於30的不同的正整數解。把a b c d按從小到大排列,用逗號分隔,每個解占用1行。比如,剛才的解輸出為:
1,9,10,12
不同解間的順序可以不考慮。
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 typedef struct Node 8 { 9 int data[4]; 10 Node *next; 11 }Node,*Nodep; 12 13 int a[30]; 14 int b[4]; 15 16 void init() 17 { 18 for(int i=1; i<30; i++) 19 a[i] = i*i*i; 20 } 21 22 int main() 23 { 24 int i,j,k,t; 25 init(); 26 Nodep head,p,q; 27 head = new Node; 28 head->next = NULL; 29 p = head; 30 //int cnt = 0;//表示鏈表里有幾個結點 31 for(i = 1;i <=29; ++i) 32 { 33 for(j = 1;j <=29; ++j) 34 { 35 if(i == j) continue; 36 for(k = 1;k <=29; ++k) 37 { 38 if(i == k || j == k) continue; 39 for(t = 1;t <=29; ++t) 40 { 41 if(i == t || j == t || k == t) continue; 42 43 if((a[i] + a[j]) == (a[k] +a[t])) 44 { 45 q = new Node; 46 47 q->data[0] = i; 48 q->data[1] = j; 49 q->data[2] = k; 50 q->data[3] = t; 51 52 sort(q->data,q->data + 4); 53 54 //題目沒要求字典序,不過abcd從小到大 排序了, 55 //並所以不是原來的順序 ,所以可以直接對新節點排序而不用再保存原來的 56 bool flag = false; 57 //用變量cnt保存結點個數在比較的時候不方便,需要結構體數組 58 Nodep phead = head->next; 59 int e; 60 while(phead) 61 { 62 for(e=0; e<4; e++) 63 { 64 if(phead->data[e]!=q->data[e]) 65 break;//不是continue 66 } 67 if(e==4) 68 { 69 flag = true; 70 break; 71 } 72 else 73 phead = phead->next; 74 75 } 76 if(flag) 77 { 78 delete q; 79 continue; 80 } 81 //尾插法,每次q->next = NULL; 82 83 84 cout<<q->data[0]; 85 for(int f=1; f<4; f++) 86 { 87 cout<<","<<q->data[f]; 88 } 89 cout<<endl; 90 q->next = NULL; 91 p->next = q; 92 p = q; 93 } 94 } 95 } 96 } 97 } 98 system("pause"); 99 return 0; 100 }