3713 - 立方和问题
<span style="font-size:22pt;"><span>•</span></span><span style="font-family:宋体;color:black;font-size:22pt;">考虑方程式:</span><span style="font-family:Arial;color:black;font-size:22pt;">a^3 + b^3 = c^3 + d^3</span><span style="font-family:Arial;color:black;font-size:22pt;"> </span>
<span style="font-size:22pt;"><span>•</span></span><span style="font-family:宋体;color:black;font-size:22pt;">其中:“</span><span style="font-family:Arial;color:black;font-size:22pt;">^</span><span style="font-family:Arial;color:black;font-size:22pt;">”表示乘方。</span><span style="font-family:Arial;color:black;font-size:22pt;">a</span><span style="font-family:宋体;color:black;font-size:22pt;">、</span><span style="font-family:Arial;color:black;font-size:22pt;">b</span><span style="font-family:宋体;color:black;font-size:22pt;">、</span><span style="font-family:Arial;color:black;font-size:22pt;">c</span><span style="font-family:宋体;color:black;font-size:22pt;">、</span><span style="font-family:Arial;color:black;font-size:22pt;">d</span><span style="font-family:宋体;color:black;font-size:22pt;">是互不相同的小于</span><span style="font-family:Arial;color:black;font-size:22pt;">30</span><span style="font-family:宋体;color:black;font-size:22pt;">的正整数。</span>
<span style="font-size:22pt;"><span>•</span></span><span style="font-family:宋体;color:black;font-size:22pt;">这个方程有很多解。比如:</span>
<span style="font-size:22pt;"><span>•</span></span><span style="font-family:Arial;color:black;font-size:22pt;">a = 1</span><span style="font-family:宋体;color:black;font-size:22pt;">,</span><span style="font-family:Arial;color:black;font-size:22pt;">b=12</span><span style="font-family:宋体;color:black;font-size:22pt;">,</span><span style="font-family:Arial;color:black;font-size:22pt;">c=9</span><span style="font-family:宋体;color:black;font-size:22pt;">,</span><span style="font-family:Arial;color:black;font-size:22pt;">d=10 </span><span style="font-family:宋体;color:black;font-size:22pt;">就是一个解。因为:</span><span style="font-family:Arial;color:black;font-size:22pt;">1</span><span style="font-family:宋体;color:black;font-size:22pt;">的立方加</span><span style="font-family:Arial;color:black;font-size:22pt;">12</span><span style="font-family:宋体;color:black;font-size:22pt;">的立方等于</span><span style="font-family:Arial;color:black;font-size:22pt;">1729</span><span style="font-family:宋体;color:black;font-size:22pt;">,而</span><span style="font-family:Arial;color:black;font-size:22pt;">9</span><span style="font-family:宋体;color:black;font-size:22pt;">的立方加</span><span style="font-family:Arial;color:black;font-size:22pt;">10</span><span style="font-family:宋体;color:black;font-size:22pt;">的立方也等于</span><span style="font-family:Arial;color:black;font-size:22pt;">1729</span><span style="font-family:宋体;color:black;font-size:22pt;">。</span>
<span style="font-size:22pt;"><span>•</span></span><span style="font-family:宋体;color:black;font-size:22pt;">当然,</span><span style="font-family:Arial;color:black;font-size:22pt;">a=12</span><span style="font-family:宋体;color:black;font-size:22pt;">,</span><span style="font-family:Arial;color:black;font-size:22pt;">b=1</span><span style="font-family:宋体;color:black;font-size:22pt;">,</span><span style="font-family:Arial;color:black;font-size:22pt;">c=9</span><span style="font-family:宋体;color:black;font-size:22pt;">,</span><span style="font-family:Arial;color:black;font-size:22pt;">d=10 </span><span style="font-family:宋体;color:black;font-size:22pt;">显然也是解。</span>
<span style="font-size:22pt;"><span>•</span></span><span style="font-family:宋体;color:black;font-size:22pt;">如果不计</span><span style="font-family:Arial;color:black;font-size:22pt;">abcd</span><span style="font-family:宋体;color:black;font-size:22pt;">交换次序的情况,这算同一个解。</span>
<span style="font-size:22pt;"><span>•</span></span><span style="font-family:宋体;color:black;font-size:22pt;">你的任务是:找到所有小于</span><span style="font-family:Arial;color:black;font-size:22pt;">30</span><span style="font-family:宋体;color:black;font-size:22pt;">的不同的正整数解。把</span><span style="font-family:Arial;color:black;font-size:22pt;">a b c d</span><span style="font-family:宋体;color:black;font-size:22pt;">按从小到大排列,用逗号分隔,每个解占用</span><span style="font-family:Arial;color:black;font-size:22pt;">1</span><span style="font-family:宋体;color:black;font-size:22pt;">行。比如,刚才的解输出为:</span>
Input
Output
Examples
Input
Output
Solution C
#include <stdio.h> #define N 29 #define M 4 void perms(int p[],int start) { int i,t; if(start==M) { if((p[0]<p[1])&&(p[0]<p[2])&&(p[2]<p[3])&&(p[0]*p[0]*p[0]+p[1]*p[1]*p[1]==p[2]*p[2]*p[2]+p[3]*p[3]*p[3])) printf("%d,%d,%d,%d\n",p[0],p[2],p[3],p[1]); return; } for(i=start;i<N;i++)// 注意i从start开始,不从0开始哦 { t=p[i];p[i]=p[start];p[start]=t;//交换 perms(p,start+1);//递归 t=p[i];p[i]=p[start];p[start]=t;//交换回来 } } int main() { int i,p[N]; for(i=0;i<N;i++) p[i]=i+1;//数组赋初值 perms(p,0);//从数组中索引号为0的元素开始进行排列 return 0; }
Solution C++
#include<iostream> #include<cmath> using namespace std; #define N 4 void F(int a[],int start) { int i,j,t; if(start==N) { int x=pow(a[0],3); int y=pow(a[1],3); int z=pow(a[2],3); int w=pow(a[3],3); if(a[2]>a[1]&&a[3]>a[2]&&a[1]>a[0]&&((x+y)==(w+z)||(x+z)==(w+y)||(x+w)==(z+y)) ){cout<<a[0]<<','<<a[1]<<','<<a[2]<<','<<a[3]<<endl;} return; } for(i=start;i<30;i++) { swap(a[start],a[i]); F(a,start+1); swap(a[start],a[i]); } } int main() { int p[30]; int i; for(i=0;i<29;i++) p[i]=i+1; F(p,0); return 0; }