2017-01-10 14 views
1

この関数は、奇数桁の数字に対しては有効ですが、偶数桁のすべての数字に対しては機能していないようです(たとえば、2662ではtrueを返しますが、906609ではtrueを返します)。私は最後の20-30分の間それを理解しようとしてきましたが、私はなぜそれを見つけませんでした。Palindromeのテスト機能

#include <math.h> 

int digits(int n) 
{ 
    return log10(n)+1; 
} 

bool ispalindrome(int n) 
{ 
    int c=digits(n); 
     for(int i=0; i<c/2; i++){ 
      int a=pow(10,i),b=pow(10,c-i-1); 
      if( int(n/a) %10 != int(n/b) %10) return false; 
     } 
     return true; 
} 

#include <iostream> 
#include <cstdlib> 
int main(int, char**argv) 
{ 
    while (*++argv) 
     std::cout << *argv 
        << (ispalindrome(std::atoi(*argv)) ? " is a palindrome." : " is not a palindrome.") 
        << std::endl; 
} 
+0

恩赦明らかではなく、あなたは、文字列回文の決意と同じように数字の比較で桁を実行するよりも入力パラメータの逆の桁から製造された2番目の数値を作成し、その結果を元の値と比較する方が簡単ではないでしょうか? – WhozCraig

+0

どのライブラリを使用しましたか? #include ?コンパイル時に警告なし? –

+3

http://cpp.sh/9kt4を再現できません – RyanP

答えて

2

私は再現することはできませんが、私はそれを文字列としてint型を比較す​​る方が簡単と思う== reversedString:

bool isPalindrome(const int& n) 
{ 
    std::stringstream ssN; 
    ssN << n; 
    auto numberAsString = ssN.str(); 
    auto reversed = numberAsString; 
    std::reverse(numberAsString.begin(), numberAsString.end()); 
    return numberAsString == reversed; 
} 

してください、コードチェック:main.cpp

0

Iを結果を再現することはできません - 両方のテストケースについて予想される回答が得られます。

ところで、あなたは、単に数字を逆にし、元と比較することにより<math.h>の必要性を回避することができます

bool ispalindrome(int n) 
{ 
    int a = 0; 

    for (int r = n; r; r /= 10) 
     a = a*10 + r%10; 

    return a == n; 
}