我正在解决一个代码强制的问题。这是问题链接->问题链接我的代码通过了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(或者如果不需要确切的宽度,那么长-长也可以(