考虑方程式: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
不同解间的顺序可以不考虑。
算法分析:
小于30的整数,暴力法,emmmm,不会炸,用四重循环,再加上判断条件,关键是怎么去掉重复,我将答案都保存在一个数组中,排序,新数据存入后与数组中已存在的数据比较,若都相同,则重复,将元素从数组中移除,不相同,保留,最后输出该数组。
欢迎各位大佬批评指正。不懂得也可以问,看到必回。
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int a,b,c,d,i=0,e[50][4],j;
for(a=1;a<30;a++)
for(b=a+1;b<30;b++)
for(c=1;c<30;c++)
for(d=c+1;d<30;d++)
{
if(a*a*a+b*b*b==c*c*c+d*d*d&&a!=c){
e[i][0]=a;
e[i][1]=b;
e[i][2]=c;
e[i][3]=d;
sort(e[i],e[i]+4);
for(j=0;j<i;j++)
{
if(e[i][0]==e[j][0]&&e[i][1]==e[j][1]&&e[i][2]==e[j][2]&&e[i][3]==e[j][3])
{
e[i][0]=0;
e[i][1]=0;
e[i][2]=0;
e[i][3]=0;
i--;
}
}
i++;}
}
for(int m=0;m<i;m++)
for(int n=0;n<4;n++)
{
printf("%d",e[m][n]);
if(n<3)
printf(",");
if(n==3)
printf("\n");
}
return 0;
}