c和c++中对long long int的处理结果不同
Different results for long long int in c and c++?
我正在努力解决这个问题-> 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
的整数。
scanf
与cin.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)中,输入的数据将是合法的。)
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 如何用数字处理log(0)
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 如何处理计算中的"unsigned long long int"?
- GCC编译器是否可以处理比long / long / int更大的其他数据类型?
- c和c++中对long long int的处理结果不同