1 년 프로그래밍에서 C++로 작업 한 우리의 과제 중 하나는 회문 수인지 여부를 확인할 수있는 함수를 작성하는 것이 었습니다 (예 : 16461). 내 코드를 업로드 하겠지만 정수에서 숫자를 추출하거나 정수의 자릿수를 검사 할 때 어디에서 시작해야할지 모릅니다. 어떤 도움이나 힌트를 주시면 감사하겠습니다!회문 정수 검사기
0
A
답변
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;
}
}
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);
정수는 숫자의 홀수가 될 요구 사항이 있습니까 :하지만 이럴
전화를 함께 ... 아주 읽을 수 ? 1661은 회문이 ... – tmpearce