【问题标题】:problem calculating the Maximum Pairwise Product C++计算最大成对积 C++ 的问题
【发布时间】:2019-11-05 18:34:10
【问题描述】:

这是我的最大成对积代码。它需要一个数字数组,对它们进行排序以找到第一个和第二个最大数字,然后返回它们的乘积。该代码适用于小数组和小值。但是它会因某些数字而失败,并且它也会因大数字(例如 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;
}

【问题讨论】:

  • 你能解释一下“严重失败”是什么意思吗?
  • 例如,当我给它一个由 10000、10、1、2、3 组成的 5 个数字的数组时,它应该返回 100000,而不是给我一些随机的大数字,比如 17346274什么的。
  • 错误在这里:for (int j=0; j&lt;=n; j++)。应该是j &lt; n。另一个循环也一样。
  • 更新:现在代码可以很好地处理像 10000 这样的大数字,但它会因为小数字而失败!我尝试了一组由 1 2 3 组成的 3 个数字,结果是 9!虽然它应该给出 2*3=6,但有什么想法吗?
  • 这一行是什么意思:if(maxind1!=j &amp;&amp; maxind2==-1 || numbers[j]&gt;numbers[maxind2])?这可能是一个优先级问题。您可能需要添加括号。

标签: c++


【解决方案1】:

(根据其他人的cmets编辑)

除了@dyukha 指出的 - 对于 (int j=0; j

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 to里面的逻辑表达式的优先级:

if(maxind1!=j && (maxind2==-1 || numbers[j]>numbers[maxind2]))

【讨论】:

  • 其实第一个if就可以了,因为C++使用Short-circuit evaluation,也就是说如果maxind1==-1为真,||后面的部分甚至都不求值。但确实第二个if 有问题:如果maxind1!=j 为假,它会评估numbers[-1]。解决方法:用括号改变优先级,即if(maxind1!=j &amp;&amp; (maxind2==-1 || numbers[j]&gt;numbers[maxind2]))。顺便说一句,这就是奇普斯特在 cmets 中所说的。
  • @FabioTurati 是的,我没有注意第一个。另外,不知道(我认为是标准逻辑操作)称为短路。
  • 在逻辑 OR 中,如果第一个为真,那么您确定整个 OR 表达式将为真,这是由于 OR 的本质。每种语言都是这样。短路增加的是,在这种情况下,甚至没有评估第二部分,因为这会浪费时间。这可以防止一些问题,就像在这种情况下一样。一个典型的例子,当你有一个指针p 时,是:if (p &amp;&amp; p-&gt;do_something())。如果p 为空,则评估第二部分会导致未定义行为(可能是分段错误),但短路会阻止它并使此代码安全运行。
  • @FabioTurati 明白这一点,但我从来没有听说过“短路”这个词是什么,或者这是一个功能。我认为这是标准逻辑
  • @Rania 请记住,如果答案解决了您的问题,您应该通过单击左侧的勾号将其标记为已接受。谢谢!
【解决方案2】:

已解决 谢谢大家帮助我,它终于正常工作了。 问题的根源是我没有在第二个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;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多