runtime error: signed integer overflow: 99998 * 100000 cannot be represented in type 'int' [solution.c]
runtime error: signed integer overflow: 99998 * 100000 cannot be represented in type 'int' [solution.c]
试图解决https://leetcode.com/problems/k-concatenation-maximum-sum/submissions/,当数据类型为long
时,我仍然得到整数溢出
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int max(int a, int b) {
return a > b ? a : b;
}
int sum(int *nums, int numSize) {
int ans = 0;
for (int i = 0; i < numSize; ++i)
ans += nums[i];
return ans;
}
int KandaneAlgo(int *nums, int numSize) {
int i, max_overall_so_far = 0, max_ending_here = 0;
for (i = 0; i < numSize; ++i) {
max_ending_here += nums[i];
if (max_ending_here < 0)
max_ending_here = 0;
if (max_overall_so_far < max_ending_here)
max_overall_so_far = max_ending_here;
}
return max_overall_so_far;
}
int kConcatenationMaxSum(int *arr, int arrSize, int k) {
int mod = pow(10, 9) + 7;
int ans;
if (k > 1) {
long tem = (k - 2) * max(sum(arr, arrSize), 0);
int t1 = tem % mod;
printf("%ld, %d, %d \n", tem, t1, mod);
int arr2[2 * arrSize];
for (int i = 0; i < 2 * arrSize; ++i)
arr2[i] = arr[i - i / arrSize * arrSize];
ans = (int)t1 + KandaneAlgo(arr2, 2 * arrSize) % mod;
} else {
ans = KandaneAlgo(arr, arrSize) % mod;
}
return ans;
}
int main() {
int arr[10] = { [0 ... 9] = 10000 };
for (int i = 0; i < 10; ++i)
printf("%d ", arr[i]);
printf("\n");
int tot = kConcatenationMaxSum(arr, 10, 100000);
printf("%d \n", tot);
return 0;
}
我在本地用lldb
调试,可以看到变量tem
的输出信息确实是错误的,应该是9999800000
.
这是因为9999800000
大于32位所能存储的。 long
仅提供 32
位的最小大小保证。如果对表达式中的所有操作数和结果变量使用 long long
,它的计算结果将是正确的值。 long long
提供最低 64 位保证。
检查此以获取更多详细信息 - https://en.wikipedia.org/wiki/C_data_types#Main_types
以下代码片段对我有用:
long long tem = (long long)(k-2) * (long long)max(sum(arr, arrSize), 0);
不确定算法的其余部分,但这会将正确的值放入 tem
。
试图解决https://leetcode.com/problems/k-concatenation-maximum-sum/submissions/,当数据类型为long
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int max(int a, int b) {
return a > b ? a : b;
}
int sum(int *nums, int numSize) {
int ans = 0;
for (int i = 0; i < numSize; ++i)
ans += nums[i];
return ans;
}
int KandaneAlgo(int *nums, int numSize) {
int i, max_overall_so_far = 0, max_ending_here = 0;
for (i = 0; i < numSize; ++i) {
max_ending_here += nums[i];
if (max_ending_here < 0)
max_ending_here = 0;
if (max_overall_so_far < max_ending_here)
max_overall_so_far = max_ending_here;
}
return max_overall_so_far;
}
int kConcatenationMaxSum(int *arr, int arrSize, int k) {
int mod = pow(10, 9) + 7;
int ans;
if (k > 1) {
long tem = (k - 2) * max(sum(arr, arrSize), 0);
int t1 = tem % mod;
printf("%ld, %d, %d \n", tem, t1, mod);
int arr2[2 * arrSize];
for (int i = 0; i < 2 * arrSize; ++i)
arr2[i] = arr[i - i / arrSize * arrSize];
ans = (int)t1 + KandaneAlgo(arr2, 2 * arrSize) % mod;
} else {
ans = KandaneAlgo(arr, arrSize) % mod;
}
return ans;
}
int main() {
int arr[10] = { [0 ... 9] = 10000 };
for (int i = 0; i < 10; ++i)
printf("%d ", arr[i]);
printf("\n");
int tot = kConcatenationMaxSum(arr, 10, 100000);
printf("%d \n", tot);
return 0;
}
我在本地用lldb
调试,可以看到变量tem
的输出信息确实是错误的,应该是9999800000
.
这是因为9999800000
大于32位所能存储的。 long
仅提供 32
位的最小大小保证。如果对表达式中的所有操作数和结果变量使用 long long
,它的计算结果将是正确的值。 long long
提供最低 64 位保证。
检查此以获取更多详细信息 - https://en.wikipedia.org/wiki/C_data_types#Main_types
以下代码片段对我有用:
long long tem = (long long)(k-2) * (long long)max(sum(arr, arrSize), 0);
不确定算法的其余部分,但这会将正确的值放入 tem
。