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

时间:2014-06-05 12:02:16

标签: c++ casting overflow largenumber

所以我在www.codility.com上参加了这个名为'permMissingElement'的练习课,这是我的代码:

#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;
}

现在,这是问题所在。我的算法有效,但由于某些原因我无法弄清楚,给出错误的答案&#34; large&#34; N的值(课程中N最多可达100,000)。

无论如何,我最初使用所有整数编写程序,然后意识到我可能因此而得到溢出,所以我将它们改为双打,但我仍然得到大的N值的错误答案...为什么是什么?

由于

2 个答案:

答案 0 :(得分:1)

双精度是浮点数,这意味着您将失去精度,尤其是对于大数字。而不是使用int使用其他整数类型,例如longlong long

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

检查此问题以获取更多指示:size of int, long, etc

答案 1 :(得分:1)

你有趣的方法,我使用以下算法在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;