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

我的算法是正确的,但有些结果是错误的?(C++),c++,casting,overflow,largenumber,C++,Casting,Overflow,Largenumber,所以我在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

所以我在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的最大值可能是100000

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


谢谢,double是浮点数,这意味着您肯定会丢失精度,特别是对于大数。不要使用int,而是使用另一个整型,如long或long

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


检查这个SO问题以获得更多的提示:

这里有一个有趣的方法,我使用以下算法在php中解决了相同的问题,将每个数组值解释为索引,然后反转值。最后一个大于0的值的位置是缺少的,并且它仍然在上运行。 这样可以避免添加大数字时出现溢出,因为不必添加任何内容

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;

double也没有infinte精度,它还可能引入舍入误差。请在发布前格式化您的代码。此外,结果似乎取决于A元素的限制。请指定错误的结果。什么输入?你期待什么?为什么?取而代之的是什么?如果您的算法只需要无符号值,您可以尝试long long或unsigned long long long,这会为您购买一些范围,但如果数字太大,最终会失败。@Csq我在问题中已经说过元素的限制是100000。@JanDvorak我无法指定。问题是,他们刚刚的评估程序说,大N不合格。这就是我所有的信息。如果我知道,我可能就不会在这里发帖了。真有趣!我不知道perl,但我将尝试对其进行解码。还有,你为什么要吃腹肌,这不是多余的吗?在这个问题上,我认为他们只考虑范围在1到100000之间的元素,所以总是积极的。只是想知道。我来分析你的答案。谢谢我尝试了一种不需要abs的方法,我尝试了一种不需要abs的方法,但结果证明更容易。通过将每个数组项的值解释为索引$n-1,因为范围为1到100.000,然后将$n处的值反转,我仍然知道原始值,即它的abs。该值很可能仍然需要,因为它可能指向另一个尚未访问的元素。顺便说一句,这是php,不是perl。