2014-04-17 7 views
0

1 년 프로그래밍에서 C++로 작업 한 우리의 과제 중 하나는 회문 수인지 여부를 확인할 수있는 함수를 작성하는 것이 었습니다 (예 : 16461). 내 코드를 업로드 하겠지만 정수에서 숫자를 추출하거나 정수의 자릿수를 검사 할 때 어디에서 시작해야할지 모릅니다. 어떤 도움이나 힌트를 주시면 감사하겠습니다!회문 정수 검사기

답변

2

해결 방법에는 여러 가지가 있습니다. 나는 대부분의 솔루션이 미러 번호를 만들고 원본과 동일한 지 여부를 확인합니다 (비록 가장 효율적인 방법은 아닙니다). 코드는 다음과 같아야합니다.

bool isPalindrom(int n) { 
    int original = n; 
    int mirror = 0; 
    while (n) { 
    mirror = mirror * 10 + n % 10; 
    n /= 10; 
    } 
    return mirror == original; 
} 
0

모듈러 산술 (% 연산자)을 사용하여 개별 숫자를 추출 할 수 있습니다. 또 다른 방법은 숫자의 문자열 표현을 가져 와서 작업하는 것입니다.

0

힌트 : 당신은 항상 왼쪽에 공의를 추가하고 여전히 같은 번호를 가질 수 있기 때문에

  • "자리의 수"정의하는 까다로운 일이다. 신중히 읽고 어떻게 정의 할 것인지 신중히 생각하십시오.
  • 정수의 자릿수는 10의 제곱 (recol 123 = 1*100 + 2*10 + 3*1)과 연관되어 있으므로 숫자를 추출하려면 10의 제곱을 추출해야합니다. 키 조작은 나머지와 잘린 구분입니다. (123 % 10)을하면 어떻게됩니까? (123/10)은 어떨까요? ((123/10) % 10)은 어떨까요?
0

가장 먼저 정수를 문자열로 변환하십시오. palindrome 인 경우 문자열을 테스트하는 것이 훨씬 쉽습니다.

if (valueText.size()%2==0) { 
     return false; 
    } 

문자열이 숫자의 홀수가있는 경우 : 문자열이 숫자의 홀수가있는 경우 지금 확인

std::ostringstream oss; 
    oss << value; 
    std::string valueText = oss.str(); 

:

#include <sstream> 
#include <iostream> 
#include <string> 

bool isPalindrome(int value) 
{ 
    // convert integer into text 
    std::ostringstream oss; 
    oss << value; 
    std::string valueText = oss.str(); 
    if (valueText.size()%2==0) { 
     return false; 
    } 
    for (int i = 0; i < (valueText.size()/2); ++i) { 
     if (valueText[i]!=valueText[valueText.size()-i-1]) { 
      return false; 
     } 
    } 
    return true; 
} 

int main() 
{ 
    for (int i = 0; i < 100000; ++i) { 
     if (isPalindrome(i)) { 
      std::cout << i << std::endl; 
     } 
    } 

    return 0; 
} 

첫 번째는 std::string로 정수를 변환 , 숫자가 일치하는지 테스트하십시오 :

for (int i = 0; i < (valueText.size()/2); ++i) { 
     if (valueText[i]!=valueText[valueText.size()-i-1]) { 
      return false; 
     } 
    } 
+2

정수는 숫자의 홀수가 될 요구 사항이 있습니까 :하지만 이럴

전화를 함께 ... 아주 읽을 수 ? 1661은 회문이 ... – tmpearce

0

여기 정수를 C 스타일 문자열로 변환하고 거기에서 이동하는 솔루션이 있습니다.

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

using namespace std; 

bool isPalindrome(int n) { 
    char s[256]; 
    sprintf(s, "%d", n); 

    char *p = s, *q = &s[strlen(s) - 1]; 
    while (*p == *q && p++ < q--) 
     ; 

    return (p == q) || (*p == *q); 
} 

int main() { 
    int n = 1644451; 
    cout << isPalindrome(n) << endl; 

    return 0; 
} 
0

성능이 문제가되지 않습니다, 당신은 ++ 11 c를 할 수 있다면, 쉬운 솔루션 읽을 경우 : 물론 수동으로 자리를 통해가는 것보다 훨씬 느립니다

template<class T> 
bool isPalindrome(T i) 
{ 
    auto s = std::to_string(i); 
    auto s2 = s; 
    std::reverse(s.begin(), s.end()); 
    return s == s2; 
} 

을,

std::cout << isPalindrome<int>(12321); 
std::cout << isPalindrome<int>(1232);