c和c++中对long long int的处理结果不同

Different results for long long int in c and c++?

本文关键字:long 处理 结果 int c++ 中对      更新时间:2023-10-16

我正在努力解决这个问题-> Candy3我们应该用长时间来解决这个问题。但是当我使用cin来获取大于10^19的输入时(我知道这是long的极限,但是有限制约束,我们应该输出正确的答案),它会给出随机输出。然而,当我使用scanf()时,它会打印正确的答案。

这真的很奇怪。b/w扫描和c/w扫描有什么区别?我的代码

#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;
}

编辑:这是一个奇怪的问题,它没有在问题中指定什么应该是输入的大小。这里是输入规范-

"输入文件的第一行包含一个整数T,指定测试用例的数量。每个测试用例前面都有一个空行。每一个测试用例如下所示:第一行包含N:的个数的孩子。接下来的N行每一行都包含糖果的数量1孩子了。"

正如许多人注意到的那样,您正在尝试读取将溢出long long的整数。

scanfcin.operator>>()在整数溢出方面的区别在于,scanf不(必然)测试整数溢出;如果读取的数字太大,结果是未定义的行为。在相应的参数中找到不正确的值是很常见的,但不能保证。

cin.operator>>(),另一方面,检查是否有整数溢出,如果发现整数溢出,它存储指定类型的最大可能整数,并将cin流置于失败状态。一旦流处于失败状态,它将一直保持在那里,直到状态被清除;此外,如果流处于失败状态,任何后续使用cin.operator>>()都不会做任何事情。

因此,一旦你试图用cin.operator>>()读取一个太大的整数,你的代码将在随后的每次读取中发现sweet是最大的long long

所以当使用c++格式化的输入时,你需要总是检查失败,并做一些适当的事情。

您输入的值大于1019。这可能会溢出long long

类型long long保证至少是64位宽,并且在我所见过的每个编译器中,恰好是 64位宽。这意味着long long的最大可能值是263-1,或9,223,372,036,854,775,807,大约是9 * 1018

如果输入值为1019或10,000,000,000,000,000,则会溢出。如果cin << ...遇到数字溢出,它将失败;你还没检查过呢

我不相信使用scanf会解决这个问题。如果scanf读取指定类型范围之外的数字,则有未定义的行为;存储垃圾值是一种可能的结果。我只能猜测你在scanf版本的程序中碰巧输入了一个比cin >> ...版本更小的数字,并且没有注意到你正在这样做。

你可以使用稍微大一些的值(以不能存储负值为代价),通过使用类型unsigned long long,它的最小值为0,最大值至少为264-1,或18,446,744,073,709,551,615,大约1.8 * 1019

如果需要更大的数字,可以考虑使用浮点数,它可以提供更大的范围,但代价是失去大值的精度。

你试过测试像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;
}

并检查您输入的值是否大于打印的值。如果是这样,只需声明一个变量,为值提供足够的空间,如果打印的值高于你输入的值,仍然有错误,请评论这篇文章

我也遇到过这个问题,因为这个例子比较特殊,可以通过scanf得到一个ac,通过cin得到一个error。其实如果出现了溢出,使用这两种输入法也会出错。
对于long long类型,对于我在"A+B和C(64位)"遇到的问题,如果我们使用示例数据";9223372036854775808 -9223372036854775808 0";对于A B C,我们可以通过cin得到错误答案,通过scanf得到正确答案;但是,如果我们使用示例数据"9223372036854775808 -9223372036854775808 -1";对于A B C,我们可以用cin得到正确答案,用scanf得到错误答案。
所以我们应该用另一种方法来解决这个问题。(或者输入的数据在(2-63, 263)中,输入的数据将是合法的。)