雖然這個程序(雙迴文)提交給USACO網站,我收到一條錯誤信息,說
「運行3:執行錯誤:你的程序(`dualpal')與 信號#11退出(分段衝突[可能是因爲訪問 內存越界,數組索引超出界限,使用錯誤的 指針(失敗的open(),失敗的malloc)或超過指定的最大內存限制])。在信號之前爲0.011 CPU秒 ,它使用了4184 KB的內存。「
有人能幫我解決這個問題嗎? 在此先感謝:)USACO dualpal錯誤:段違規
我不認爲這是一個內存問題,因爲它使用相同數量的內存作爲其他測試和程序(4184 KB)。
問題: 一個從右到左閱讀相同的數字,當從左到右閱讀時稱爲迴文。 數字21(基數10)不是基數10中的迴文數,但數字21(基數10)實際上是基數2(10101)中的迴文數。 編寫一個程序,讀取兩個數(以10爲基數表示): N(1 < = N < = 15) S(O <小號< 10000) ,然後查找並打印(在基體10)的前N個編號嚴格大於S,當寫在兩個或更多數字基地(2 < =基地< = 10)時是迴文。 此問題的解決方案不需要操縱大於標準32位的整數。
我的代碼:
//include all necessary header files
using namespace std;
struct DivResults
{
int remainder;
int quotient;
};
DivResults remAndQuo(int numerator,int radix,int exponent)
{
DivResults retVal;
double a=numerator,b=radix,c;
c=pow(b,exponent);
int rPowi=c;
retVal.remainder=numerator%rPowi;
retVal.quotient=numerator/rPowi;
return retVal;
}
char *myOwnItoa(int num,int radix)
{
char *returnArr,charQuotient;
int exp=0,remainder,quotient,j=0;
int rPowi;
returnArr=new char[12];
/*
find max exponent of radix where it is just less than or equal to
num
*/
for(;pow(radix,exp)<=num;exp++);
exp--; // subtracting by 1 to cancel the extra increment in for loop
/*
iterate from max exponent to 0
to convert each digit into its radix base.
*/
for(;exp>=0;exp--)
{
DivResults retVal=remAndQuo(num,radix,exp);
charQuotient=retVal.quotient+'0';
returnArr[j]=charQuotient;
num=retVal.remainder;
j++;
}
returnArr[j]='\0';
return returnArr;
}
bool palindrome(char answer[])
{
int n,x=0;
for(x=0;answer[x]!='\0';x++);
n=x;
int i=0,j=n-1;
if(n%2==0)
{
int middle1=(n-1)/2;
int middle2=(n+1)/2;
while(i<=middle1 && j>=middle2)
{
if(answer[i]!=answer[j])
return false;
i++;
j--;
}
return true;
}
else
{
int middle=n/2;
while(i<middle && j>middle)
{
if(answer[i]!=answer[j])
return false;
i++;
j--;
}
return true;
}
}
int main()
{
ofstream fout("dualpal.out");
ifstream fin("dualpal.in");
int n,s,check=0,palCheck=0,num;
char *CharAnswerNum;
fin>>n>>s;
num=s+1;
for(;check<n;)
{
for(int base=2;base<=10;base++)
{
CharAnswerNum=myOwnItoa(num,base);
bool isPal=palindrome(CharAnswerNum);
if(isPal==true)
{
palCheck++;
}
}
if(palCheck>=2)
{
fout<<num<<"\n";
check++;
}
num++;
palCheck=0;
}
}
這就是爲什麼調試器存在。爲(; POW(基數,EXP)<= NUM; EXP ++); – OldProgrammer
@OldProgrammer此代碼適用於我的電腦,但是當我將它提交給USACO網站時,會出現錯誤。 –