我对竞争性编程还不陌生,我已经在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上运行它,但似乎也没有收到任何警告。
答案 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
用作无符号的整数。