我正在努力解决这个问题 - > Candy3 我们应该用很长的时间来解决这个问题。但是当我使用cin来获取大于10 ^ 19的输入时(我知道它是长long的限制但是指定了限制约束而我们应该输出正确的答案)它是随机的输出。然而,当我使用scanf()时,它正在打印正确答案。
这真的很奇怪。 b / w scanf和cin有什么区别。 我的代码
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int t,n;
cin>>t;
while(t--){
long long sum=0,sweet;
cin>>n;
for(int i=0; i<n; i++){
//cin>>sweet; printing yes no randomly
scanf("%lld", &sweet); // working correctly
sum = (sum + sweet)%n;
}
if(sum)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
编辑:这是一个奇怪的问题,问题中没有指出输入的大小应该是多少。这是输入规范 -
&#34;输入文件的第一行包含一个指定的整数T. 测试用例数量。每个测试用例前面都有一个空行。每 测试用例如下:第一行包含N:数量 儿童。接下来的N行中的每一行包含糖果数量 孩子带来了。&#34;
答案 0 :(得分:3)
您说您输入的值大于10 19 。这可能会溢出long long
。
类型long long
保证至少为64位宽,并且在每个编译器上我都看到它正好 64位宽。这意味着long long
的最大可能值是2 63 -1,或9,223,372,036,854,775,807,大约9 * 10 18 。
如果输入10 19 或10,000,000,000,000,000的值,它将溢出。如果cin << ...
遇到数字溢出,它将失败;你还没有检查过。
我不相信使用scanf
可以解决这个问题。 scanf
如果读取指定类型范围之外的数字,则具有未定义的行为;存储垃圾值是可能的结果。我只能猜测您使用scanf
版本的程序而不是使用cin >> ...
版本输入较小的数字,并且没有注意到您这样做了
您可以使用类型unsigned long long
来使用更大的值(以无法存储负值为代价),类型{{1}}的最小值为0,最大值为2 64 < / sup> -1,或18,446,744,073,709,551,615,约1.8 * 10 19 。
如果你需要更大的数字,你可以考虑使用浮点数,这会给你一个更大的范围,但代价是失去大值的精度。
答案 1 :(得分:3)
正如许多人所指出的那样,你试图读取会溢出long long
的整数。
scanf
和cin.operator>>()
之间关于整数溢出的差异是scanf
不(必然)测试整数溢出;如果读取的数字太大,结果是未定义的行为。您在相应的参数中找到不正确的值是很常见的,但是没有保证。
cin.operator>>()
,另一方面, 检查整数溢出,如果找到整数溢出,它会存储指定类型的最大可能整数并放入{{1流入失败状态。一旦流处于故障状态,它将一直保持在那里直到状态被清除;此外,如果流处于故障状态,cin
的任何后续使用都将不起作用。
因此,一旦您尝试使用cin.operator>>()
读取过大的整数,您的代码会在每次后续读取时发现cin.operator>>()
为最大可能sweet
。
因此,当使用C ++格式的输入时,您需要始终检查失败,并执行适当的操作。
答案 2 :(得分:2)
您是否尝试过测试5等小数字?如果它正在工作,它可能是您输入的数字中的某些内容,可能超出long long int
可以包含的最大值。只需尝试在您的系统上执行此操作:
#include <iostream>
#include <stdio.h>
#include <limits>
using namespace std;
int main()
{
std::cout << std::numeric_limits<long long int>::max() << std::endl;
return 0;
}
并检查您输入的值是否大于打印的值。如果是这样,只要声明一个具有足够空间的变量值,如果打印的值高于您输入的值并且仍然存在错误,请对此帖子发表评论。