用C编写一个小程序

来源:百度知道 编辑:UC知道 时间:2024/06/19 03:46:14
首先给定一个有两个元素的初始数列S2{1,1},其中S2表示有两个元素的数列;如果该数列的相邻的两个元素的和等于该数列的元素个数,将所以满足条件的两个元素之间放入他们的和元素,这样就可以得到如下数列:
S2{1,1},S3{1,2,1},S5{1,3,2,3,1},S7{1,3,5,2,5,3,1},…
给你的问题是,输出数列变换后个数为n(100>n>2)的数列,如果不存在,输出“Impossible!”。
输入
输入的第一行为一个正整数N,表示测试用例的个数,接下来的N行,每行的第一个数是初始数列的个数n(n<100),第2个数为需要你输出变换后的数列个数m(m<100),接下来为n个正整数,他们都由一个空格隔开。
输出
标准输出,如果有满足条件的数列,使用一行输出该数列,元素之间使用一个空格分开。如果没有符合条件的数列,就使用一行输出“Impossible!”。

样例
输入:
2
2 5 1 1
3 6 2 2 4
输出
1 3 2 3 1
Impossible!

#include <stdio.h>
#include <stdlib.h>

int Test (int *&a,int first,int last)
{
int count=first,i;
if(last==first)
{
for(i=0;i<first;i++)
printf("%d ",a[i]);
}
else if(last<first)
{
printf("error");
exit(-1);
}
else
{
for(i=0;i<first-1;i++)
if(a[i]+a[i+1]==first)
count++;//如果有则记录容量加一

if(count==first)//元素个数未增长,说明不存在这样的数组使元素个数为要求值
{
printf("impossible\n");
return 0;
}

if(count<last)//处理一次插入,然后继续调用该函数,并别忘了释放原来元素所占的空间
{
int *b=new int[count];
int j=0;
for(i=0;i<first-1;i++)
{
b[j++]=a[i];
if(a[i]+a[i+1]==first)
b[j++]=first;
}
b[j++]=a[first-1];//a数组的最后一个元素别忘了赋给b数组
delete(a);
Test(b,count,last);
}

else if(count==last)//说明找到