运行时错误:有符号整数溢出:3 * 965628297无法在类型 '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(或者如果不需要确切的宽度,那么长-长也可以(

最新更新