蓝桥杯a^3 + b^3 = c^3 + d^3
考虑方程式: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 }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.