我的算法是正确的,但有些结果是错误的?(c++)
My algorithm is correct, but some results are wrong? (C++)
所以我把这个叫做'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
,使用long
或long 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;
相关文章:
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 为什么这个程序的结果是3 "born"?和 4 死
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- C++初始化的结果是什么?
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 我的输出结果是 0 英寸C++.可能是什么问题
- 这个错误可能是什么?ANSI C文件
- 如何修复循环中的错误产生的错误结果?
- Android (ART) 崩溃并显示错误 JNI 在应用程序中检测到错误:jstring 是无效的本地引用
- 添加可变参数函数的错误结果
- 使用特征 3 线性系统求解器的错误结果
- 在C++中使用 fread() 来解释这个结果是什么?
- 为什么双算的结果是错误的?
- 按位包含 OR 的错误结果
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 将双精度转换为 int 的结果是错误的
- 使用浮点值和铸造的算术运算的错误结果 - 差异很大,我想这不是准确值的情况(429497)?
- 我的算法是正确的,但有些结果是错误的?(c++)
- 为什么我的执行结果是正确的,但观察列表结果是错误的