我的算法是正确的,但有些结果是错误的?(c++)

My algorithm is correct, but some results are wrong? (C++)

本文关键字:错误 结果是 c++ 算法 我的      更新时间:2023-10-16

所以我把这个叫做'permMissingElement'的实践课放在www.codility.com上,下面是我的代码:

#include <iostream>
using namespace std;
int solution(vector<int> &A)
{
    int N = A.size();
    double Nf = double(N);
    int n;
    double missingf;
    int missing;
    double sumN1, sumN2;
    int sum = 0;
    double sumf;
    double two = 2.0;
    for (n = 0; n < N; n++)
    {
        sum = sum + A[n];
    }
    sumf = double(sum);
    sumN1 = (Nf+double(1.0))/double(2.0);
    sumN2 = sumN1*(Nf+double(2.0));
    missingf = sumN2 - sumf;
    missing = int(missingf);
    return missing;
}

现在,问题来了。我的算法是有效的,但由于某种原因,我不知道,在N的"大"值上给出了错误的答案(在课程中N的最大值可以是100,000)。

无论如何,我最初使用所有int型编写程序,然后意识到可能会因此溢出,所以我将它们更改为双精度,但我仍然在N的大值上得到错误的答案…为什么呢?

谢谢

双精度数是浮点数,这意味着一定会失去精度,特别是对于大数字。代替使用int,使用longlong long等其他整型

c++标准没有指定每种类型的确切大小,但是int至少是16位,long至少是32位,long long至少是64位。

检查这个SO问题更多的指针:int, long等的大小

您有一个有趣的方法,我在php中使用以下算法解决了相同的问题,将每个数组值解释为索引,然后反转值。最后一个值>0的位置就是缺失的那个,它仍然在O(n)内运行。这样可以避免添加大数字时溢出,因为您不需要添加任何东西。

error_reporting(0);
$s = count($A); 
for ($i=0; $i<$s; $i++)
{
    $n = abs($A[$i])-1;
    $A[$n]*=(-1);
}
for ($i=0; $i<$s; $i++)
{
if ($A[$i]>0)
        return $i+1;
}
return $s+1;