东华oj-进阶题第44题-双重回文数

我的梦境 提交于 2020-03-06 18:44:36

在这里插入图片描述

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';
}

开始我还以为要将转换后的进制结果再逆一下,后来知道是不用的,因为逆不逆对判断回文数没有影响

这个题学到了:

  1. 数字转字符
  2. 要用到函数中处理后得到的字符串时,最好将字符串作为函数参数传入,而不是作为返回值返回,这样会省掉很多麻烦
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!