一道c语言的题目。急求大神解答。

2024-11-08 11:17:49
推荐回答(2个)
回答(1):

这是由于原来的程序采用了递归,而且递归程序中的局部变量有较大的数组。当递归层数太多时,就会造成系统栈溢出,而导致程序崩溃。

以下的程序改为非递归的,就不会再有此现象:

#include 

void f(int n,int a[],int b[]) 

 int j,i,c[20000]; 

  for(i=0;i<2*n;i++) c[i]=a[i]; 

   for(i=0,j=1;i

   for(j=0;i<2*n;i++,j=j+2) a[j]=c[i]; 

int main() 

   int i,n,a[20000],b[20000],num=0;         //做到20000张牌也能正确出解

 scanf("%d",&n); 

    for(i=0;i<2*n;i++) a[i]=i; 

  for(i=0;i<2*n;i++) b[i]=i; 

  for(i=0;i

  {

    f(n,a,b);

num++;

for(i=0;i<2*n;i++)

 if(a[i]!=b[i])break;

}

printf("%d\n",num);  

   return 0; 

}

回答(2):

//采纳答案很对,但是函数可以少传入一个变量,for循环可以合并下
#include
void f(int n,int a[])
{
int j,i,c[20000];
for(i=0; i<2*n; i++) c[i]=a[i];
for(i=0,j=1; i for(j=0; i<2*n; i++,j=j+2) a[j]=c[i];
}
int main()
{
int i,n,a[20000],b[20000],num=0,flag=1; //做到20000张牌也能正确出解
scanf("%d",&n);
for(i=0; i<2*n; i++)
{
a[i]=i;
b[i]=i;
}
for(i=0; i {
f(n,a);
num++;
for(i=0; i<2*n; i++)
{
if(a[i]!=b[i]) break;
}
}
printf("%d\n",num);
return 0;
}