C++ 在spoj上提交时出现运行时错误(SIGSEGV)
当在SPOJ上提交此代码时,我收到运行时错误(SIGSEGV)错误。我清除了向量并初始化了所有变量,但仍然得到了错误。这个代码有什么问题C++ 在spoj上提交时出现运行时错误(SIGSEGV),c++,runtime,segmentation-fault,C++,Runtime,Segmentation Fault,当在SPOJ上提交此代码时,我收到运行时错误(SIGSEGV)错误。我清除了向量并初始化了所有变量,但仍然得到了错误。这个代码有什么问题 #include<iostream> #include<vector> using namespace std; vector<int> even_greater_increment(vector<int> num,int mid1,int mid2){ int bigindex=0,smallinde
#include<iostream>
#include<vector>
using namespace std;
vector<int> even_greater_increment(vector<int> num,int mid1,int mid2){
int bigindex=0,smallindex=0;
if(num[mid1]==num[mid2]){
return num;
}
if(num[mid1]>num[mid2]){
bigindex=mid1;
smallindex=mid2;
}
else{
bigindex=mid2;
smallindex=mid1;
}
while(num[smallindex]!=num[bigindex]){
num[smallindex]++;
}
return num;
}
bool check9(vector<int> num,int vlen){
for(int i=0;i<vlen;i++){
if(num[i]==9){
continue;
}
else{
return false;
}
}
return true;
}
int nine(vector<int> num,int vlen){
vlen=vlen+1;
num[0]=1;
cout<<num[0];
for(int i=1;i<vlen-1;i++){
num[i]=0;
cout<<num[i];
}
num[vlen-1]=1;
cout<<num[vlen-1];
return 0;
}
vector<int> increment9(vector<int> num,int mid1,int mid2,int vlen){
int l=mid1,k=mid2;
do{
l--;k++;
}while((l>=0&&k<=(vlen-1))&&(num[l]==9&&num[k]==9));
num[l]++;
num[k]++;
for(int i=l+1;i<k;i++){
num[i]=0;
}
return num;
}
vector<int> incrementmiddle(vector<int> num,int mid1,int mid2,int vlen){
if(num[mid1]==9&&num[mid2]==9){
num=increment9(num,mid1,mid2,vlen);
return num;
}
if(mid1==mid2){//odd implementation
num[mid1]=num[mid1]+1;
}
else{//even implementation
num=even_greater_increment(num,mid1,mid2);
}
return num;
}
int println(vector<int> r,int vlen){
for(int p=0;p<vlen;p++){
cout<<r[p];
}
}
bool comp(const vector<int>& v1, const vector<int>& v2) {
if (v1.size() != v2.size())
return v1.size() < v2.size();
for (int i = 0; i < v1.size(); i++)
if (v1[i] != v2[i])
return v1[i] < v2[i];
return false;
}
int palindrome(){
int length=0;
char ch[7];
cin>>ch;
for(int i=0;ch[i]!='\0';i++){
length++;
}
vector<int> num;
vector<int> temp;
for(int j=0;j<length;j++){
int a= ch[j] - '0';
num.push_back(a);
}
int vlen=num.size();
int mid1=0,mid2=0;
if(vlen==1){
cout<<num[0]<<endl;
return 0;
}
if(vlen==2){
mid1=0;mid2=1;
int bigindex,smallindex;
if(num[mid1]>num[mid2]){
bigindex=mid1;
smallindex=mid2;
}
else{
bigindex=mid2;
smallindex=mid1;
}
num[smallindex]=num[bigindex];
println(num,2);
return 0;
}
if(vlen%2==0){
mid2=vlen/2;
mid1=mid2-1;
}
else{
mid1=mid2=vlen/2;
}
temp=num;
if(mid1==mid2){
int y=mid1;
//for odd implementation
for(int j=0;j<mid1;j++){
++y;
num[y]=num[j];
}
//num contains palindrome and temp contains original
if(comp(temp,num)){
println(num,vlen);
return 0;
}//printing the number if the palindrome is greater than the input number
else{
if(check9(num,vlen)){
nine(num,vlen);
return 0;
}
num=incrementmiddle(num,mid1,mid2,vlen);
println(num,vlen);
return 0;
}
}
else{//even implementation
int h=vlen-1;
for(int b=0;b<mid1;b++){
num[h]=num[b];
h--;
}
if(comp(temp,num)){
num=even_greater_increment(num,mid1,mid2);
println(num,vlen);
return 0;
}//printing the number if the palindrome is greater than the input number
else{
if(check9(num,vlen)){
nine(num,vlen);
return 0;
}
num=incrementmiddle(num,mid1,mid2,vlen);
println(num,vlen);
return 0;
}
}
num.clear();
temp.clear();
}
int main(){
int test=0;
cin>>test;
testcase:
for(int f=0;f<test;f++){
palindrome();
cout<<endl;
}
}
#包括
#包括
使用名称空间std;
向量偶数大于增量(向量数,整数mid1,整数mid2){
int bigindex=0,smallindex=0;
if(num[mid1]==num[mid2]){
返回num;
}
if(num[mid1]>num[mid2]){
bigindex=mid1;
smallindex=mid2;
}
否则{
bigindex=mid2;
smallindex=mid1;
}
while(num[smallindex]!=num[bigindex]){
num[smallindex]++;
}
返回num;
}
布尔校验9(向量数,整数){
对于(int i=0;i)您是否尝试过添加一些断言,表明所有索引都在向量的范围内?“逻辑和所有内容都是正确的”嗯,显然不是。你试过在调试器中运行它吗?它似乎也不正确。我输入了数字63615
,然后得到了答案63663
,它既大于63615
,也不是回文。我期望得到答案63536
。或者我误解了它应该做什么?你知道吗您可以通过引用传递向量。这将允许您修改原始向量,而不必制作副本并返回副本。您的标签testcase:
未使用;请删除它。