这是我的最大成对乘积代码。它需要一个数字数组,对它们进行排序以找到第一个和第二个最大数字,然后返回它们的乘积。该代码适用于较小的数组和较小的值。但是它会因某些数字而失败,并且在诸如10000之类的大数字时会普遍失败。
我认为我使用的数据类型存在问题,因此我将数据类型定义为int_64t,以便可以处理大量数据,但仍然得到相同的错误结果!有人可以帮我吗?
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
int64_t MaxPairwiseProduct(const std::vector<int64_t>& numbers) {
int n = numbers.size();
if(n<2)
return;
int maxind1=-1;
for (int i=0; i<=n; i++)
{
if(maxind1==-1 || numbers[i]>numbers[maxind1])
maxind1=i;
int maxind2=-1;
for (int j=0; j<=n; j++)
{
if(maxind1!=j && maxind2==-1 || numbers[j]>numbers[maxind2])
maxind2=j;}
int64_t restult=numbers[maxind1]*numbers[maxind2];
return restult;
}
int main() {
int n;
std::cin >> n;
std::vector<int64_t> numbers(n);
for (int i = 0; i < n; ++i) {
std::cin >> numbers[i];
}
cout << MaxPairwiseProduct(numbers) << "\n";
return 0;
}
答案 0 :(得分:2)
(根据其他人的评论进行编辑)
除了@dyukha指出的内容-对于(int j = 0; j <= n; j ++)-也: maxind2在下面的代码中可以为负,该代码用于下标向量。
int maxind1=-1;
for (int i=0; i<=n; i++)
{
if(maxind1==-1 || numbers[i]>numbers[maxind1])
maxind1=i;
int maxind2=-1;
for (int j=0; j<=n; j++)
{
if(maxind1!=j && maxind2==-1 || numbers[j]>numbers[maxind2])
解决方案是将if中的逻辑表达式的优先级更改为:
if(maxind1!=j && (maxind2==-1 || numbers[j]>numbers[maxind2]))
答案 1 :(得分:0)
已解决 谢谢大家的帮助,它终于正常运行了。 问题的根源是我没有在第二个if条件和for循环的条件中使用括号(使用<代替<=) 解决错误后的代码:
#include <cstdlib>
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
int64_t MaxPairwiseProduct(const std::vector<int64_t>& numbers) {
int n = numbers.size();
int maxind1=-1;
for (int i=0; i<n; i++)
{
if(maxind1==-1 || numbers[i]>numbers[maxind1])
maxind1=i;
}
int maxind2=-1;
for (int j=0; j<n; j++)
{
if(j!=maxind1 && (maxind2==-1 || numbers[j]>numbers[maxind2]))
maxind2=j;}
int64_t restult=numbers[maxind1]*numbers[maxind2];
return restult;
}
int main() {
int n;
std::cin >> n;
std::vector<int64_t> numbers(n);
for (int i = 0; i < n; ++i) {
std::cin >> numbers[i];
}
cout << MaxPairwiseProduct(numbers) << "\n";
return 0;}