可不可以看看我的程序为什么进程超时呢

10 、(本题10分)
将不多于10个的正整数输入到数组a[ ]中,以-1作为结束符, 要求数组的值按逆序重新存放并输出(不包含-1)。

输出语句必须是:

for(i=0;i<n;i++) printf("%d ",a[i]);

例如,输入: 8 6 5 4 1 -1

输出 1 4 5 6 8。

注意输入数据和输出数据的格式,且注意-1并不在逆序存放的范围内。

【作答结果】

#include<stdio.h>
  void main()
{
  int i,t,n=0;
  int a[10];
  for(i=0;i<10;i++)
  {
    scanf("%d",&a[i]);
  }
  for(i=0;i!=-1;i++)
  {
    n++;
  }
  for(i=0;i<n/2;i++)
  {
    t=a[i]; 
    a[i]=a[n-i-1];
    a[n-i-1]=t;
  }
  for(i=0;i<n;i++)
    printf("%d",a[i]);
}

如果输入的数据不足10个,程序就不会往下执行,修改如下:

#include<stdio.h>
  void main()
{
  int i,t,n=0;
  int a[10];
  for(i=0;i<10;i++)
  {
    scanf("%d",&a[i]);
    if(a[i]==-1)
        break;
  }
  n=i;
  for(i=0;i<n/2;i++)
  {
    t=a[i]; 
    a[i]=a[n-i-1];
    a[n-i-1]=t;
  }
  for(i=0;i<n;i++)
    printf("%d",a[i]);
}

img


死循环了 并且你的输入个数和你题目中也不对应 你的代码必须输入十个数啊


#include<stdio.h>
void main()
{
  int i,t,n=0;
  int a[10];
  for(i=0;i<10;i++)
  {
    scanf("%d",&a[i]);
    if(a[i] == -1) break;
  }
  for(i=0;a[i]!=-1;i++)
  {
    n++;
  }
  for(i=0;i<n/2;i++)
  {
    t=a[i]; 
    a[i]=a[n-i-1];
    a[n-i-1]=t;
  }
  for(i=0;i<n;i++)
    printf("%d ",a[i]);
}

把第二个for循环去掉即可,因为这个for循环导致超时了,因为起始i=0,然后每次循环后++依然是不等于-1的,因为是要等很久溢出后变成负数,再++很久之后才可能变成-1,但会超时很久,然后数组元素的个数n直接把i的值赋给它即可;

之后然后把获取输入那里修改为读入-1时停止获取输入即可,修改如下:

#include<stdio.h>
  int  main()
{
  int i=0,t,n=0;
  int a[10];
  scanf("%d",&a[i]);
  while(a[i]!=-1&&i<10)
  {
      i++;
    scanf("%d",&a[i]);
  }
//  for(i=0 ;i!=-1;i++)
//  {
//    n++;
//    printf("i=%d\n",i); 
//  }
    n = i;
  for(i=0;i<n/2;i++)
  {
    t=a[i]; 
    a[i]=a[n-i-1];
    a[n-i-1]=t;
  }
  for(i=0;i<n;i++)
    printf("%d ",a[i]);
}

img

for(i=0;i!=-1;i++)
典型死循环
a[i]!=-1

第10行是死循环

第二个for循环不应该拿i去比较,应该是数组元素比较。

好好看看你的第二个循环,程序出得来吗

你这个for这样写,i != -1 永远都满足,死循环了

img

for(i=0;i!=-1;i++)
{
n++;
}
为啥i!=-1啊?i++啊,这得运行到i溢出才会结束啊

因为你在输入的时候没有判断 -1 还在等待你输入 所以超时


#include <stdio.h>
void main()
{
    int i, t, n = 0;
    int a[10];
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
        if(a[i] == -1)
        {
            break;
        }
    }
    n = i;
    for (i = 0; i < n; i++)
        printf("%d ", a[n - i - 1]);
    printf("\n");
}

第一个for循环条件表达式有点问题,输入数据的时候要输满10个才停止

n-i-1-1

既然是逆序且数组长度固定了,为啥不从后往前插入?

for(i=8;i>=0;i--)
  {
    scanf("%d",&a[i]);

}
这样不行吗?还是说有其它限制(dog)