有n个数 两两相加可的n*(n-1)/2个数 然后把这些相加后的数字排序 要求用相加并排好序列的数求原始数
例如
1 4 6 7
相加排序后 5 7 8 10 11 13
输入5 7 8 10 11 13
输出1 4 6 7
下面程序输入格式
输入:6 //第一行 n表示要输入n个数
5 7 8 10 11 13 // 第二行输入 这n个数
输出:1 4 6 7
#include<stdio.h>
#include<math.h>
void main()
{
int a[5000];//原数组
int b[50];//解集
bool ok[5000]={false};//判断原数据相应位置是出现过
int i,j,k,l,n,w;
i=0;
scanf("%d",&n);
while(scanf("%d",&a[i++])&&i<n);
for(w=1;w<=a[0]/2;w++)//枚举第一个解
{
b[0]=w;//存放第一个解
b[1]=a[0]-w;//第二个解
for(i=2;i<(1+sqrt(1+8*n))/2;i++)
{
k=i-1;
while(ok[k]){k++;}
b[i]=a[k]-b[0];
ok[k]=true;
for(j=0;j<i;j++)
for(l=i;l<n;l++)
{
if((a[l]==b[j]+b[i])&&!ok[l])
{
ok[l]=true;
while(a[l]==b[j]+b[i]){l++;}
}
}
}
for(j=2;j<n;j++)
if(!ok[j])break;
if(j==n)
{
for(i=0;i<(1+sqrt(1+8*n))/2;i++)
printf("%d ",b[i]);
break;
}
else
{
for(j=0;j<n;j++)
ok[j]=false;
}
}
}