Statement of the Problem
We say that a number is a palindrom if it is the sane when read from left to right or from right to left. For example, the number 75457 is a palindrom.
Of course, the property depends on the basis in which is number is represented. The number 17 is not a palindrom in base 10, but its representation in base 2 (10001) is a palindrom.
The objective of this problem is to verify if a set of given numbers are palindroms in any basis from 2 to 16.
Input Format
Several integer numbers comprise the input. Each number 0 < n < 50000 is given in decimal basis in a separate line. The input ends with a zero.
Output Format
Your program must print the message Number i is palindrom in basis where I is the given number, followed by the basis where the representation of the number is a palindrom. If the number is not a palindrom in any basis between 2 and 16, your program must print the message Number i is not palindrom.
Sample Input
17
19
0
Sample Output
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom
Source: South America 2001
Regionals 2001 >> Latin America - South America
问题链接:UVALive2389 ZOJ1078 Palindrom Numbers。入门训练题,用C语言编写程序。
题意简述:输入若干个整数,0作为结束。对于输入的整数n,问其几进制为回文数?
问题分析:
这是一个有关进制处理的问题,都是套路。
程序中,封装了一个函数ispalindrom()用于将整数转换为指定进制的字符串,同时判断是否为回文数。使用数组ans[]作为标志,其元素个数需要多一个,是否为回文数的标志放在ans[0]中。
程序说明:
原来的C语言程序不够简洁,又写了一版C++的程序。
UVALive的问题与ZOJ的问题微妙的差异需要注意,ZOJ中不存在回文时,输出的字符串为:“Number 19 is not a palindrom”,多一个“a”,坑啊!!!
AC的C++语言程序如下:
/* UVALive2389 ZOJ1078 Palindrom Numbers */
#include <iostream>
#include <string.h>
using namespace std;
const int N = 16;
bool ispalindrome(int product, int base)
{
int miror = 0, temp;
temp = product;
while(temp) {
miror *= base;
miror += temp % base;
temp /= base;
}
return miror == product;
}
int main()
{
int n;
int ans[N+1];
while(cin >> n && n) {
memset(ans, 0, sizeof(ans));
for(int i=2; i<=N; i++)
if(ispalindrome(n, i))
ans[0] = 1, ans[i] = 1;
if(ans[0]) {
cout << "Number " << n << " is palindrom in basis";
for(int i=2; i<=N; i++)
if(ans[i])
cout << " " << i;
cout << endl;
} else
cout << "Number " << n << " is not palindrom" << endl;
}
return 0;
}
AC的C语言程序如下:
/* UVALive2389 ZOJ1078 Palindrom Numbers */
#include <stdio.h>
#include <memory.h>
#define MAXN1 20000
#define MAXN2 16
char t[MAXN1];
int ispalindrom(int val, int base)
{
int count=0, start, end;
while(val) {
t[count++] = val % base;
val /= base;
}
start = 0;
end = count - 1;
count = 1;
while(start < end) {
if(t[start] != t[end]) {
count = 0;
break;
}
start++;
end--;
}
return count;
}
int main(void)
{
int n, i;
int ans[MAXN2+1];
while(scanf("%d", &n) != EOF && n != 0) {
memset(ans, 0, sizeof(ans));
for(i=2; i<=MAXN2; i++)
if(ispalindrom(n, i)) {
ans[0] = 1;
ans[i] = 1;
}
if(ans[0]) {
printf("Number %d is palindrom in basis", n);
for(i=2; i<=MAXN2; i++)
if(ans[i])
printf(" %d", i);
printf("\n");
} else
printf("Number %d is not palindrom\n", n);
}
return 0;
}