初莫M 发表于 2023-10-12 17:15:24

时间超限了要怎么解决啊

题目描述
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。

输入描述
输入数据的第一行为一个正整数 T
,表示有 T
组测试数据。
接下来T
行,每行第一个整数N
,然后有N
个整数,无序。0<N≤100


输出描述
输出共 T
行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数#include<stdio.h>
int main()
{
    int n,i,a,j,t,s=0;
    scanf("%d",&n);
    while(n--)
    {
      while(scanf("%d",&i)!='\n')
      {
            j=0;
            a=i;
            j++;
      }
      for(i=0;i<=j;i++)
      {
            s=0;
            for(int c=0;c<j-i-1;c++)
            {
                if(a>a)
                {
                  t=a;a=a;a=t;s++;
                }
            }
            printf("%d",s);
      }
      
    }
}

isdkz 发表于 2023-10-12 17:15:48

这段代码中出现了两个问题:

1. 输入读取错误,导致排序数据错误。
2. 在内层循环中输出了每一次交换的次数,而不是总交换次数。

以下是修改后的代码:

#include<stdio.h>
int main()
{
    int n,i,a,j,t,s=0;
    scanf("%d",&n);
    while(n--)
    {
      j=0; // 修正输入读取错误
      while(scanf("%d",&i)!=EOF) // 修正输入读取错误
      {
            a=i;
            j++;
            if (getchar()=='\n') break; // 修正输入读取错误
      }
      for(i=0;i<j;i++) // 修改内层循环
      {
            s=0;
            for(int c=0;c<j-i-1;c++)
            {
                if(a>a)
                {
                  t=a;a=a;a=t;s++;
                }
            }
      }
      printf("%d\n",s*j); // 输出总交换次数
    }
}

Mike_python小 发表于 2023-10-12 17:17:14

你好!根据你提供的C代码,我注意到其中有一些错误和改进的空间。首先,你在第一个while循环中使用了while(scanf("%d",&i)!='\n')来读取整数,这是不正确的用法。应该使用for循环来读取N个整数。另外,你在外层的for循环中又重新定义了s变量,这将导致每次循环时s都被重置为0。此外,在输出结果时,你没有打印换行符。

以下是修正后的代码:


#include <stdio.h>

int main() {
    int T;
    scanf("%d", &T);

    while (T--) {
      int N, i, j, t, s = 0;
      scanf("%d", &N);
      int a;
      
      for (i = 0; i < N; ++i) {
            scanf("%d", &a);
      }
      
      for (i = 0; i < N; ++i) {
            for (j = 0; j < N - i - 1; ++j) {
                if (a > a) {
                  t = a;
                  a = a;
                  a = t;
                  s++;
                }
            }
      }
      
      printf("%d\n", s);
    }

    return 0;
}


请注意,我对代码进行了一些修改,包括修复了循环读取整数的错误,并且在输出结果时打印了换行符。你可以将这段代码替换掉你原来提供的代码,并进行测试。

希望能帮到你!如果你有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 时间超限了要怎么解决啊