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
11
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.
问题陈述
如果一个数字在从左到右或从右到左阅读时是理智的,我们就说它是回文。 例如,数字 75457 是回文。
当然,属性取决于表示数字的基础。 数字 17 不是以 10 为底的回文,但它以 2 为底(10001)的表示是回文。
这个问题的目的是验证一组给定的数字是否是从 2 到 16 的任何基础上的回文。
输入格式
几个整数组成输入。 每个数字 0 < n < 50000 以十进制形式在单独的行中给出。 输入以零结束。
输出格式
11
您的程序必须打印消息 Number i is palindrom in base where I 是给定的数字,然后是数字表示为回文的基础。 如果数字不是 2 到 16 之间的任何基数的回文,您的程序必须打印消息 Number i is not palindrom。
#includeusing namespace std; #include #define Maxn1 50000 #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_s("%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 palindromn", n); } return 0; }



