c - 处理大量数字和溢出

标签 c algorithm

给定一个包含 N 个元素的数组,我需要找到该数组中的索引 P,其中 0到P范围内的值之和等于P+1到N-1范围内的值之和。

数组中每个元素的值范围为 -2147483648 到 2147483647 N 最大可为 10000000。

鉴于此,如何确保在添加每个值以查找索引 P 时不会溢出?

最佳答案

为确保不溢出,请使用 int32_tint64_t

值的范围 [-2147483648 ... 2147483647] 与 int32_t 范围匹配。您也可以使用 int64_t 来实现此目的,但 10000000 的数组需要考虑空间。

由于任意 10,000,000 个值的总和不超过 int64_t 的范围,因此使用 int64_t 执行所有加法。

#include <stdint.h>
size_t foo(const int32_t *value, size_t N) {
  int64_t sum = 0;
  ...
  sum += value[i];
  ...
}

顺便说一句:有信心可以找到不需要添加 64 位附加功能的解决方案。
[编辑] 未能导出简单的 int32_t 唯一解决方案,但提出了:

size_t HalfSum(const int32_t *value, size_t N) {
  // find sum of entire array    
  int64_t ArraySum = 0;
  size_t P;
  for (P = 0; P < N; P++) {
    ArraySum += value[P];
  }

  // compute sum again, stopping when it is half of total
  int64_t PartialSum = 0;
  for (P = 0; P < N; P++) {
    PartialSum += value[P];
    if ((PartialSum * 2) == ArraySum) {
      return P;
    }
  }

  return N;  // No solution (normally P should be 0 ... N-1)
}

关于c - 处理大量数字和溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152375/

相关文章:

c - 找出该算法的最坏情况运行时间,以检查一个数字是否能被 3 整除

css - GtkCSS : Naming objects by id in CSS doesn't work

c - threadpools - 老板/ worker 与同行(工作人员)模型

c++ - 舍入大纲的开始和结束

java - 在 Java 中类型转换或解码 C 对象

algorithm - 找到最大的连续和,使得它的最小值和它的补码最大

c# - 使用因消息类型而异的处理资源来消费队列的消息

java - 给定素数分解,生成一个数的所有因数

java - 将数组拆分为两个总和最小的子数组

php - 如何使用 PHP 对范围内的数字进行分组