喜洋洋 c++

    技术2022-05-19  24

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