假设我有2个整数数组,它们可能长度不同,任何索引上的值都是有效整数(min~max)。如:
int data1[] = {1227210749, 382745290, 567552295, 1910060611,
577735884, 75518037, 742485551, 1202127013,
386030509, 308032134};
int data2[] = {1729472635, 1258098863, 259427472, 1664987257,
994376913, 1581883691, 1728724734, 2034013490};
我怎样才能快速比较它们,知道哪一个有更大的数额?
int compare(int a[], int len_a, int b[], int len_b)
{
// compares if the sum of data1 is bigger than sum of data2
}
答案 0 :(得分:1)
直观地(在我的情况下这是非常弱的,我猜,我不是算法专家)这种感觉就好像如果不看一次每个数字就不可能,并且只是计算和。这是因为整数是有符号的,当添加任何元素时,数组的总和可以变为0(或负数),因此你必须查看它们的所有元素。
所以,尝试实现这样的函数:
int int_array_sum(const int *array, size_t num_elements);
然后只需在两个数组中的每个数组上调用它,然后进行比较。
编辑:正如Tristan's answer中指出的那样,添加潜在的大整数时存在溢出的风险。如果这是一个问题(这确实是应用程序特定的,也许溢出结果是“有更大的总和”的一部分),你可以切换到更宽的整数类型,或者与double
一起使用。
答案 1 :(得分:1)
显而易见的方法是获取两个数组的总和,看看哪个更大。像这样:
int compare(int a[], int len_a, int b[], int len_b)
{
return (std::accumulate(a, a+len_a, 0) - std::accumulate(b, b+len_b, 0);
}
然而,这引入了整数溢出的可能性。将accumulate
的最后一个参数更改为0LL
或0.0
可以避免这种情况。
答案 2 :(得分:0)
int compare( int a[], int len_a, int b[], int len_b )
{
long long sum_a = std::accumulate( a, a + len_a, 0ll );
long long sum_b = std::accumulate( b, b + len_b, 0ll );
return ( sum_a < sum_b ? -1 : ( sum_a == sum_b ? 0 : 1 ) );
}
答案 3 :(得分:0)
int compare(int a[], int len_a, int b[], int len_b)
{
double sum1=0;
double sum2=0;
for(int i=0;i<len_a;i++)
sum1=sum1+a[i];
for(int i=0;i<len_b;i++)
sum2=sum2+b[i];
if( sum1>sum2)
return 1;
else
return 0;
}