考虑方程式: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
不同解间的顺序可以不考虑。
程序代码
#include<iostream>
using namespace std;
typedef struct node
{
int data[4];
struct node *next;
}node,*nodep;
int arr[30];
void fang();
void sort(int a[],int n);
int main()
{
fang();
nodep head,p,q;
head = new(node); //用于存放数据的链表头结点
head->next = NULL;
q = head;
for(int i = 1;i <=29; ++i)
{
for(int j = 1;j <=29; ++j)
{
if(i == j) continue; //防止同一组数据中出现重复数据
for(int k = 1;k <=29; ++k)
{
if(i == k || j == k) continue; //防止同一组数据中出现重复数据
for(int l = 1;l <=29; ++l)
{
if(i == l || j == l || k == l) continue; //防止同一组数据中出现重复数据
if((arr[i] + arr[j]) == (arr[k] +arr[l]))
{
int flag = 0; //判断是否结束本次循环的标志
p = new(node);
p->data[0] = i;
p->data[1] = j;
p->data[2] = k;
p->data[3] = l;
sort(p->data,4);
nodep px = head;
while(px)
{
int m;
//判断新结点中的数据是否与已存在的数据重复
for(m = 0;m < 4; ++m)
{
if(px->data[m] != p->data[m]) break;
}
//当新结点中的数据与已存在的数据重复时将结束标志置为1,并结束while循环
if(4 == m)
{
flag = 1;
break;
}
//否则指针后移
else px = px->next;
}
if(flag)
{
//结束标志为1时,即新结点中的数据与已存在的数据重复时,释放新结点,并结束本次循环
delete(p);
continue;
}
//将新结点连接到链表中
p->next = NULL;
q->next = p;
q = p;
//输出找到的组合
for(int n = 0;n < 3; ++n)
{
cout<<p->data[n]<<",";
}
cout<<p->data[3]<<endl;
}
}
}
}
}
return 0;
}
//求1~29的3三次方,并将结果存放在arr[]数组中
void fang()
{
arr[0] = 0;
for(int i = 1;i <= 29; ++i)
{
arr[i] = i * i * i;
}
}
//将数组array中的元素按从小到大的顺序排序
void sort(int array[],int n)
{
int k;
int temp;
for(int i = 0;i < n - 1; ++i)
{
k = i;
for(int j = i + 1;j < n;++j)
{
if(array[k] > array[j]) k = j;
}
temp = array[k];
array[k] = array[i];
array[i] = temp;
}
}