我正在努力解决这个问题:

给出五个正整数,找出可以通过将五个整数中的四个正好相加而计算出的最小值和最大值.然后将各自的最小值和最大值打印为一行两个空格分隔的长整数. (输入是数组arr的五个元素)

void miniMaxSum(int arr_count, int *arr) 
{ 
    unsigned long int sum1, sum2, sum3, sum4, sum5, max, min;
    int i;
    sum1 = arr[0] + arr[1] + arr[2] + arr[3];
    sum2 = arr[4] + arr[1] + arr[2] + arr[3];
    sum3 = arr[0] + arr[4] + arr[2] + arr[3];
    sum4 = arr[0] + arr[1] + arr[4] + arr[3];
    sum5 = arr[0] + arr[1] + arr[2] + arr[4];
    min = max = sum1;
    unsigned long int sumall[5] = { sum1, sum2, sum3, sum4, sum5 };
    for (i = 0; i < arr_count; i++) {
        if (sumall[i] >= max) {
            max = sumall[i];
        } else if (sumall[i] <= min) {
            min = sumall[i];
        }
    }
    printf("%lu %lu", min, max);
}

上面的函数给出输出

2063136757 18446744072159051663

对于输入

256741038 623958417 467905213 714532089 938071624

推荐答案

执行更广泛的加法,而不是有符号整数溢出风险的int次加法(undefined behavior(UB)).

void miniMaxSum(int arr_count, int* arr) { 
  unsigned long int sum1, sum2, sum3, sum4, sum5, max, min;
  ...
  sum1=arr[0]+arr[1]+arr[2]+arr[3];
  //   ^ int addition w/int sum  ^

  sum1 = 0UL + arr[0] + arr[1] + arr[2] + arr[3];
  //     ^ unsigned long addition with unsigned long sum ^

更好的是,因为long可能不会更宽,所以使用long long,并保留signed种类型:

  long long sum1 = 0LL + arr[0] + arr[1] + arr[2] + arr[3];
  //               ^ long long addition w/long long sum  ^
  ...
  printf("%lld %lld",min,max);

Curious way to find min/max

OP的最小/最大搜索循环查找5个和中的最小/最大.请注意,OP的最大值超过INT_MAX.

2,063,136,757
2,744,467,343

The sum of all 5 minus max sum in then the the min value of the 5 original.
The sum of all 5 minus min sum in then the the max value of the 5 original.

938,071,624
256,741,038

C++相关问答推荐

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

使用NameSurname扫描到两个单独的字符串

编译的时候g++通常会比GCC慢很多吗?

如何将字符串argv[]赋给C中的整型数组?

为什么在此程序中必须使用Volatile关键字?

特定闪存扇区的内存别名

在 struct 中强制转换空指针

每个 struct 变量在C中都有自己的命名空间吗?

Make Node函数.S有什么问题吗?

如何编写一个for循环来计算C中各项的总和?

如何使用C++在控制台中以彩色打印被阻止的客户端

如何修复我的qsort()算法?它每次都给出不同的结果

我正在使用c学习数据 struct ,在学习堆栈时,我试图将中缀转换为后缀,并编写了这段代码.代码未给出输出

不兼容的整数到指针转换传递';char';到类型';常量字符*

C struct 中的冒泡排序

程序打印一些随机空行

macos/arm64 上地址空间不使用第一位吗?

多行表达式:C 编译器如何处理换行符?

使用 SDL2 的 C 程序中的内存泄漏

char* 上的 free() 被 valgrind 识别为无效