【问题标题】:Unexpected return value in this C program此 C 程序中的意外返回值
【发布时间】:2021-08-22 20:30:28
【问题描述】:

我编写了一个 C 程序来查找数组中最大偶数和最小偶数索引的差异(这里 0 被认为是偶数,从测试用例来看,它绝对不像数组应该排序)。如果数组中有一个元素或该数组中没有偶数,它将返回一个值或否。

#include <math.h>
#include <stdio.h>



int main() {
  
    int n,small,big,a[50],b1,s1,diff;
    scanf("%d",&n);
    for(int i =0;i<n;i++){
        scanf("%d",&a[i]);
    }
    


    
    small = a[0];
    big = a[0];
    
    for (int i = 1; i < n; i++)
    {
        if (a[i] < small && a[i]%2 == 0)
        {
            small = a[i];
            s1 = i;
        }
        if (a[i] > big && a[i]%2 == 0)
        {
            big = a[i];
            b1 = i;
        }
    }
    diff = b1-s1;
    
    if(diff==0){
      printf("NO");
    }
    else{
      printf("%d",diff);
    }
    
    return 0;
}

当我输入时

4
120 0 4 7

它不返回 1 。它返回 32657。 我在这里不明白什么逻辑?请帮帮我。

【问题讨论】:

  • 由于您的问题是关于 C 的,请不要标记 C++,因为解决方案会有所不同。
  • 您没有初始化所有变量。如果数组中没有偶数,那么 s1b1 将得到 indeterminate 值,从而导致 diff 计算的未定义行为
  • 如果a[0] 不是偶数会怎样?最好将第一个元素与所有其他元素一样对待,并将 b1s1 初始化为 -1 以表示:到目前为止没有看到偶数元素。您打印 NO 的条件应反映这一点。
  • 我怀疑你的意思是“输出”而不是“返回”。
  • @FredLarson 感谢您指出这一点。我已将其删除。

标签: c algorithm initialization max min


【解决方案1】:

在这段代码中sn-p

small = a[0];
big = a[0];

你还需要初始化s1b1

s1 = 0;
b1 = 0;

一般来说,您的方法是不正确的,因为 a[0] 可以是奇数,也可以是数组中的最大或最小数字。

所以首先你需要在数组中找到第一个偶数,如果存在这样的数字(例如在索引 i 处)然后写入

small = a[i];
big = a[i];
s1 = i;
b1 = i;

请注意,您实际上可以在程序中的任何位置包含标头&lt;stdio.h&gt;,因为在第一次包含标头后,实际上不会包含所有其他标头。但是不要那样做,因为这会让你的程序很奇怪。:)

所以在 main 中删除这个指令

#include <stdio.h>

也是指令

#include <math.h>

是多余的,因为您的程序中没有使用来自标头的声明。您也可以删除它。

【讨论】:

    猜你喜欢
    • 2013-06-26
    • 2016-12-20
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多