2013-08-22 31 views
-1

我試圖在CodeChef問題上工作(問題鏈接:: http://www.codechef.com/problems/K2)。在移動到下一個測試用例之前,代碼應該爲每個測試用例輸入一個輸入,並顯示結果。但它只是在沒有任何輸出的情況下進行輸入。 我無法找出錯誤,因爲g ++編譯器沒有提供任何信息。Segmentaton Fault

#include <iostream> 
#include <string> 
#include <cstring> 
#include <stdio.h> 

using namespace std; 
using std::string; 

char baseArr[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 

bool isPalin(string number) 
{ 
    int len=number.size(); 
    bool flag=true; 
    for(int i=0; i<len/2, flag==true; i++) 
    { 
     if(number[i]==number[len-(i+1)]) 
      continue; 
     else 
     { 
      flag=false; 
     } 
    } 
    return flag; 
} 
string baseChange(long int number, int base) 
{ 
    int i=1; 
    int rem=0; 
    string output =" "; 
    while(number>0) 
    { 
     rem=number%base; 
     number=number/base; 
     output=baseArr[rem]+output; 
    } 
    return output; 
} 
int main() 
{ 
    long int input; 
    int testcase; 
    string number; 
    int i; 
    bool palin=false; 
    scanf("%d", &testcase); 
    while(testcase--) 
    { 
     palin=false; 
     scanf("%ld", &input); 
     for(i=2; palin==false;i++) 
      { 
       { 
        palin=isPalin(baseChange(input, i)); 
       } 
      } 
     printf("%d\n",i); 

    } 
} 
+1

你得到什麼錯誤? –

+1

爲什麼不直接通過調試器中的代碼直到找到該錯誤? –

+0

@Shamim Hafiz - 沒有錯誤。 「但它只是在沒有任何輸出的情況下進行投入。」這只是表現不盡人意。 –

回答

2

您認爲最大基數爲16,但情況可能並非如此。除了有效索引之外,您可能會遇到分段錯誤以訪問baseArr。我沒有想到解決方案,但我相信實際解決方案可以在不考慮數字的任何字符值的情況下實施。

+0

但是這不取決於輸入。如果我提供的輸入如21,其結果是基數2中的迴文,則不必訪問0和1以外的數組元素。 – psyc0der

+0

有時,分段錯誤不會導致立即崩潰,而可能會導致副作用,例如在此描述的副作用。 –

+0

@ psyc0der如果您的代碼無法爲您描述的情況生成輸出,可能還有其他問題不是我所描述的。無論如何,如果你希望最終能夠接受解決方案,我所建議的是無論如何你都應該考慮的事情。 –

0

有解決的迴文問題:

#include <sstream> 
#include <cstdlib> 

bool test_palindrome(const std::string& value) 
{ 
    for (unsigned int i = 0; i < value.length()/2; i++) 
    { 
     if (value[i] != value[value.length() - 1 - i]) 
      return false; 
    } 
    return true; 
} 

std::string find_palindrome(unsigned long num) 
{ 
    std::string ret = ""; 
    for (int i = 2; i <= 32; i++) 
    { 
     char buffer[100] = {0}; 
     std::string value = ::itoa(num, buffer, i); 
     std::cout << "Testing: Base=" << i << " Value=" << value << std::endl; 
     bool test = test_palindrome(value); 
     if (test) 
     { 
      std::stringstream ss; 
      ss << value << " (base " << i << ")"; 
      ret = ss.str(); 
      break; 
     } 
    } 
    return ret; 
} 

int main() 
{ 
    unsigned long input = 0; 
    std::cout << "Enter number to search: "; 
    std::cin >> input; 

    std::string palin = find_palindrome(input); 

    std::cout << std::endl << "Palindrome Found: " << palin << std::endl; 

    return 0; 
}