【发布时间】:2015-06-22 19:38:02
【问题描述】:
我有这个问题: 有 K 行 N 个数字(32 位)。我必须选择具有最大数字乘积的行。
主要问题是 N 可以达到 20。 我正在尝试用对数来做到这一点:
ld sum = 0, max = 0;
int index = 0;
for(int i = 0; i < k; i ++) { // K lines
sum = 0, c = 0;
for(int j = 0; j < n; j ++) { // N numbers
cin >> t;
if(t < 0)
c++; // If the number is less than 0 i memorize it
if(t == 1 || t == -1) { // if numbers = 1 OR -1
sum += 0.00000001; // Because log(1) = 0
if(t == -1)
c ++;
}
else if(t == 0) { // if some number is equal to zero then the sum is = 0
sum = 0;
break;
}
else {
sum += log10(fabs(t));
}
}
if(c % 2 == 1) // if c is odd than multiply by -1
sum *= -1;
if(sum >= max) {
max = sum;
index = i;
}
if((sum - max) < eps) { // if sum is equal to max i'm also have to choose it
max = sum;
index = i;
}
}
cout << index + 1 << endl;
该程序适用于 50% 的测试用例。有没有办法优化我的代码?
【问题讨论】:
-
您的程序只运行了一半,您想优化它吗?先让它工作......
-
@Borgleader 对不起我的英语,我只是找不到合适的词。我只想说也许计算有任何错误,或者你可以分享我可以找到信息的链接,谢谢!
-
那么 long double 的精度(我认为这是
ld的 typedef'd 吗?)不足以代表您的产品。您应该使用任意精度的算术,例如 GMP 库或 Java 的BigInteger类提供的。 -
您是否尝试过将浮点值相乘?您将在现代台式 PC 上遇到的那种环境提供了范围远远超过 2^620 的双精度算术。当然,要获得精确的答案,您仍然需要多精度整数运算。
-
(如果这是一场比赛,请说明并提供链接。)(请说明
numbers (32-bit)是什么 - 假设自然,如果允许负整数,请说明什么是抢手的:最高有符号或绝对乘积。)尝试除草 - 剔除因子1,产品至少包含一个因子0。考虑素数分解:计算每个素数和乘积。如果产品 a 的计数没有大于 b 并且至少小于一个,则丢弃产品 b。减去每个素数的最小计数。相乘和比较。
标签: c++ algorithm optimization biginteger