Eosin Hsieh 2024-12-25 20:02 采纳率: 100%
浏览 15
已结题

C语言PAT-交换最大值最小值

求解,这是我自己根据这题写的代码,结果什么的运行完全一样呀,可是OJ平台就是报错,只改了一个地方就对了,为什么不改会错呀,单步调试也没看出来有什么问题

这是问题

img


#include<stdio.h>
int main()
{
    int i = 0,k1 = 0,k2 = 0,N = 0,min= 0,temp = 0,max = 0;
    int arr[100];
    scanf("%d",&N);
    for( i = 0; i<= N-1; i++)
    {
        scanf("%d",&arr[i]);    
    }
    min = arr[0];max = arr[N-1];     //就是这里,如果我把max改成arr[0],OJ平台就显示正确了,为什么呀
     for(i = 0; i <= N-1; i++)
     {
         if(min > arr[i])
         {
             k1 = i;
             min = arr[k1];
         }
         if( max < arr[i])
         {
             k2 = i;
             max = arr[k2];
         }
     }
     temp = arr[k1];
     arr[k1] = arr[0];
     arr[0] = temp;
     if(k2==0)
        k2 = k1;
      temp=arr[N-1];
      arr[N-1]=arr[k2];
      arr[k2]=temp;
     for(i = 0; i <= N-1; i++)
     {
         printf("%d ",arr[i]);
     }
}
  • 写回答

3条回答 默认 最新

  • a5156520 2024-12-25 20:51
    关注

    如果把最大值max初始赋值为最后一个元素的值,但是没有将最大值的下标k2赋值为最后一个元素的下标时,当最后一个元素就是最大值,而最大值下标不对,交换就会出错;

    而最大值max初始赋值为数组第一个元素的值,而最大值下标k2也为0,则最大值及其下标是匹配的,所以在比较后再交换值就不会出错。

    测试如下:

    #include<stdio.h>
    
    int main()
    {
        int i = 0,k1 = 0,k2 = 0,N = 0,min= 0,temp = 0,max = 0;
        int arr[100];
        scanf("%d",&N);
        for( i = 0; i<= N-1; i++)
        {
            scanf("%d",&arr[i]);    
        }
        min = arr[0];
        // 因为最大值max初始赋值为数组最后一个元素的值,但是最大值下标k2仍是初始值0
        // 则当数组最大值为最后一个,并且最小值不为第一个时,交换结果就会出错
        // 但是当最大值max赋值为第一个元素的值,并且最大值下标k2也为0
        // 则当最大值在下面的比较中,更新了值,则对应的最大值下标k2也更新了,这样交换就不会出错
        // 总的原因在于,最大值及其下标是否一致,一致的话,交换就正确,不一致则交换就会出错 
        max = arr[0];    
         for(i = 0; i <= N-1; i++)
         {
             if(min > arr[i])
             {
                 k1 = i;
                 min = arr[k1];
             }
             if( max < arr[i])
             {
                 k2 = i;
                 max = arr[k2];
             }
         }
         
         temp = arr[k1];
         arr[k1] = arr[0];
         arr[0] = temp;
         if(k2==0)
            k2 = k1;
          temp=arr[N-1];
          arr[N-1]=arr[k2];
          arr[k2]=temp;
          
         for(i = 0; i <= N-1; i++)
         {
             printf("%d ",arr[i]);
         }
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 12月25日