c和c ++中long long int的结果不同?

时间:2014-06-21 20:37:26

标签: c++ c

我正在努力解决这个问题 - > 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;

3 个答案:

答案 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的整数。

scanfcin.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;
}

并检查您输入的值是否大于打印的值。如果是这样,只要声明一个具有足够空间的变量值,如果打印的值高于您输入的值并且仍然存在错误,请对此帖子发表评论。