运行时错误:有符号整数溢出:3 * 965628297无法在类型 'int' 中表示
Runtime error: signed integer overflow: 3 * 965628297 cannot be represented in type 'int'
我正在解决一个代码强制的问题。这是问题链接->问题链接我的代码通过了10个测试案例中的9个,第10个案例是这个
100
??b一一aca?c一ca??????ac?baabb?cac??cbca???一bbaa?ca??bcbc??cab?ac???cbcbb?cabac
我得到的错误是这个
错误答案应为"331264319",找到的为"-2013 109745">
诊断检测到问题[cpp.crang++-diagnose]:p71.cpp:14:20:运行时错误:有符号整数溢出:3*965628297不能在类型"int"中表示摘要:未定义行为分析器:中的未定义行为p71.cpp:14:20
其他测试用例
6 ac?bc输出-24
7???????输出-2835
9 cccbbbaaa输出-0
100 accbaccabccbbbbabaccbcbbbbbbbbc?caaabcabcaaccbccabaabccabababcbbccbbababaac输出-14634
除了上的第一个测试用例外,所有测试用例都给出了正确的答案
我提交的代码就是这个
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
string s; cin>>s;
int e=1, a=0, ab=0, abc=0;
for(int i=0; i<n; i++){
if(s[i] == 'a') a+=e;
else if(s[i]=='b') ab+=a;
else if(s[i]=='c') abc+=ab;
else if(s[i]=='?') {
abc = 3*abc+ab;
ab = 3*ab+a;
a = 3*a+e;
e = 3*e;
}
}
cout<<abc<<endl;
return 0;
}
我尝试过这些东西->将int
更改为long long int
。
这里的输出发生了变化,但仍然是错误的和负面的。输出->-1959750440526388721
。
然后我尝试在声明变量时使用无符号。这也给了我错误,但不是消极的。输出->2281857551
。
由于您需要结果"模10^9+7";,你可以减少所有加法和乘法的结果";模10^9+7";(即,求除以10^9+7后的余数——这就是%
运算符的作用(。
在代码中,您可以在每次计算中或在循环结束时执行此操作。应用第一个选项(以及一些好习惯(如下:
#include <iostream>
#include <string>
// Avoid using namespace std;
int main() {
unsigned n; std::cin >> n;
std::string s; std::cin >> s;
unsigned e = 1, a = 0, ab = 0, abc = 0; // We do not need negative numbers
unsigned m = 1000000007; // Calculate result modulo 10^9+7
for(unsigned i = 0; i < n; i++) {
if(s[i] == 'a') a = (a + e) % m;
else if(s[i]=='b') ab = (ab + a) % m;
else if(s[i]=='c') abc = (abc + ab) % m;
else if(s[i]=='?') {
abc = (3 * abc + ab) % m;
ab = (3 * ab + a) % m;
a = (3 * a + e) % m;
e = (3 * e) % m;
}
}
std::cout << abc << std::endl;
return 0;
}
基本上,并不是每个整数都是相等的。它们在内存中有一个最大大小。
问题是没有足够的内存来表示这么大的数字,所以计算机没有足够的空间来表示你的数字。
编辑:更好的解决方案是使用%运算符来避免这些问题。根据练习,这就是的建议
旧解决方案:
一个解决方案是使用不同类型的int,如int64_t(或者如果不需要确切的宽度,那么长-长也可以(
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 指针问题:从不兼容的类型"int"分配给"int *"
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 错误:数组下标的类型"int[int]"无效
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 类型"int"和"const char [15]"到二进制"运算符<<"的无效操作数^
- 从类型bankAccount的返回值到函数返回类型int没有可行的转换
- for 循环说 - 错误 成员引用基类型"int [13]"不是结构或联合
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 如何增加模板类型 int 参数?
- 尝试使用 Array 类的模板构造整数数组时,错误:为什么数组类型"int [5]"不可分配,
- 如何为底层类型 int 的枚举专门化类
- 数组下标编译的无效类型'int[int]'由于 -Wfatal 错误而终止
- 不能将 "const char*" 类型的值分配给类型 "int" 的实体
- 数组下标的无效类型INT [INT]
- 请求在"伺服控制器"中请求成员"附加",该成员属于非类类型"int"
- 数组类型 'int [8]'不可分配
- 未声明的标识符和类型"int"从 main 调用类时出现意外错误