44 双重回文数
作者: xxx时间限制: 1S章节: 一维数组
问题描述 :
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做回文数。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数 N (1<= N <= 15) S (0 <S <10000)
然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。
本问题的解决方案不需要使用大于4字节的整型变量。 输入说明 :只有一行,用空格隔开的两个数N和S。 输出说明 :
N行, 每行一个满足上述要求的数,并按从小到大的顺序输出。 输入范例 : 3 25 输出范例 : 26 27 28
代码:
/*
T44 双重回文数
*/
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 100
int isSymNum(char num[]);
void toXScale(char res[], int n, int x);
int main() {
int i = 0, j = 0;
int count = 0;
char res[MAX_SIZE] = "";
int N = 0, S = 0;
scanf("%d%d", &N, &S);
S++;
while (1) {// 前面N个
count = 0;
for (j = 2; j <= 10; j++) {// 二进制~九进制
toXScale(res, S, j);
if (isSymNum(res))
count++;
if (count == 2)
break;
}
if (count == 2) {
printf("%d\n", S);
N--;
}
S++;
if (N == 0)
break;
}
return 0;
}
// 判断回文数
int isSymNum(char num[]) {
int i = 0;
int len = strlen(num);
for (i = 0; i < len / 2; i++) {
if (num[i] != num[len - i - 1])
return 0;
}
return 1;
}
// 10进制转X进制
void toXScale(char res[], int n, int x) {
int i = 0;
while (n) {
res[i++] = (char)(n % x + 48);// +48:'0'的ASCII码为48,这里表示数字转字符串
n /= x;
}
res[i] = '\0';
}
开始我还以为要将转换后的进制结果再逆一下,后来知道是不用的,因为逆不逆对判断回文数没有影响
这个题学到了:
- 数字转字符
- 要用到函数中处理后得到的字符串时,最好将字符串作为函数参数传入,而不是作为返回值返回,这样会省掉很多麻烦