喜洋洋 c++

有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;

              }

       }

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值