例5007 回文数

例5007 回文数

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Total Submissions: 73 Accepted Submissions: 51
Problem Description
如果一个数从左往右读和从右往左读都是一样的话,那么我们就称它是一个回文数。例如,75457就是一个回文数。
当然,这种性质要取决于这个数是在什么进制下。例如,17在十进制下不是一个回文数,但在二进制下(10001)则是一个回文数。
题目要求你来验证给定的数在2~16进制中的哪些进制下是否是回文数。

Input
输入文件包含了若干个十进制整数n,0 < n < 50000,每个整数占一行。0表示结束。

Output
如果整数i在某些进制下是回文数,则输出“Number i is palindrom in basis”,然后分别输出这些进制,其中i是给定的整数。如果在2~16进制下都不是回文数,则输出“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

#include <stdio.h>
#include <string.h>
int main()
{
	int num;
	while(scanf("%d",&num),num)
	{
		int f1 = 0; 
		if(num==0) break;
		int is[20];
		int c[50];
		memset(is,0,sizeof(is));
		for(int i = 2 ; i<=16 ; i++)
		{
			int temp = num;
			int f2 = 0;
			int j = 0;
			while(temp)
			{
				c[j++] = temp%i;
				temp /= i;
			}
			//注意这里的k<j/2。如果数组c长度为5,则j为6,即k<3,可以比较第1,2,4,5位。 
			//但是如果使k<(j-1)/2,那么就是k<2,只能比较第 1,5位 ,这样会出错 
			for(int k = 0;k<j/2;k++)
			{
				if(c[k]!=c[j-1-k])
				{
					f2 = 1;
					break;
				}
			}
			if(!f2)
			{
				if(!f1) f1 =1;//如果有一个进制下满足回文,就给f1置1(这一步最多执行一次) 
				is[i]=1;
			}
		}
		if(!f1)
		{
			printf("Number %d is not a palindrom",num);
		}
		else
		{
			printf("Number %d is palindrom in basis",num);
		}
		for(int i = 2;i<=16;i++)
		{
			if(is[i])
			printf(" %d",i);
		}
		printf("\n");
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值