分享

USACO/dualpal

 liluvu 2013-06-14

Translate:USACO/dualpal

Dual Palindromes 双重回文数


目录

 [隐藏

[编辑]描述

如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。

事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。

编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。

本问题的解决方案不需要使用大于32位的整型

[编辑]格式

PROGRAM NAME: dualpal

INPUT FORMAT:

(file dualpal.in)

只有一行,用空格隔开的两个数N和S。

OUTPUT FORMAT:

(file dualpal.out)

N行, 每行一个满足上述要求的数,并按从小到大的顺序输出.

[编辑]SAMPLE INPUT

3 25

[编辑]SAMPLE OUTPUT

26
27
28
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 128
#define MAX 300

char radix[20] = {
	'0','1','2','3','4','5','6','7','8','9',
	'A','B','C','D','E','F','G','H','I','J'
};

int isPal(int val, int r){
	char temp[MAXLEN] = {0};
	int i = 0;
	while (val){
		temp[i++] = radix[val%r];
		val /= r;
	}

	int ret = 1;
	for (int j = 0, k = i-1; j < k; j++, k--){
		if (temp[j] != temp[k]) {
			ret = 0;
			break;
		}
	}
	return ret;

}

char* ntor(char str[MAXLEN], int n, int r){
	memset(str, 0x0, MAXLEN*sizeof(char));

	int i = 0;
	while (n){
		str[i++] = radix[n%r];
		n /= r;
	}

	int temp;
	for (int j = 0, k = i-1; j < k; j++, k--){
		temp = str[j];
		str[j] = str[k];
		str[k] = temp;
	}

	return str;
}

int main(){
	FILE *fin = NULL;
	FILE *fout = NULL;

	fin = fopen("dualpal.in", "r");
	fout = fopen("dualpal.out", "w");

	int n = 0;
	int val = 0;
	fscanf(fin, "%d %d", &n, &val);

	while (n){
		int cnt = 0;
		++val;
		for (int i = 2; i <= 10 && cnt <= 2; i++){
			if (isPal(val, i)) cnt++;
		}

		if (cnt == 2) {
			n--;
			printf("%d\n", val);
		}	
	}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多