为什么我的代码在在线评审和本地评审中给出不同的答案?

时间:2018-09-16 14:49:57

标签: c++

我对竞争性编程还不陌生,我已经在CodeForces中遇到过几次这个问题,我不确定是怎么回事。

问题是,当我运行这段代码时(来自http://codeforces.com/contest/1041/problem/B的示例):

#include <iostream>

long gcd (long n1, long n2) {
    return (n2 == 0) ? n1 : gcd (n2, n1 % n2);
}

long min(long a, long b){
  return a < b ? a : b;
}

int main(){
  std::ios_base::sync_with_stdio(false);

  long a, b, x, y;

  std::cin >> a >> b >> x >> y;

  long g = gcd(x, y);

  std::cout << min(a / (x / g), b / (y / g)) << std::endl;

输入为(codeforces页面中问题的第4个输入)

1000000000000000000 1000000000000000000 999999866000004473 999999822000007597

我在本地得到了正确的答案

1000000063

但是当我将其发送给CodeForces时,它给了我“错误答案”,当我去检查它得到了什么答案时,它会说

0

要检查我的代码是否在做错什么,我coded the same thing in Java正常运行。

因此,我检查了它是否与我发送的版本(C ++ 17)和其他版本(C ++ 11)发送的版本有关,但是再次收到“错误答案”,但答案是< / p>

1

所以我想知道我的C ++代码在做错什么,导致它无法在在线法官中运行。

PS。 我尝试在valgrind上运行它,但似乎也没有收到任何警告。

2 个答案:

答案 0 :(得分:8)

在Codeforces上,long似乎只有4个字节,最多只能存储2147483483647,而在本地环境中它可以存储更大的值(可能是8个字节)。

您可以添加#include <cstdint>并使用类型int64_t来使用8字节有符号整数,并且兼容性更好。

答案 1 :(得分:4)

正如我在评论中所说,

  

long在CF上可能是4字节,而在计算机上是8字节。尝试使用long long,它到处都是8字节。

在C ++中,该标准仅强制执行sizeof(long) >= sizeof(int),不能保证long为8字节或更多。某些平台可能具有sizeof(long) == 8,例如64位Ubuntu或macOS。但是for Java, long is always 8-bytes long。这是一个微妙的差异,通常会使人们感到困惑。

C ++标准确实要求long long的长度至少为8个字节,因此您可以安全地将其用作有符号的64位整数,或将unsigned long long用作无符号的整数。