52 回文平方数

52 回文平方数

作者: xxx时间限制: 1S章节: 一维数组

问题描述 :

回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2=<B<=20进制),输出所有的大于等于1小于等于300且该数的平方用B进制表示时是回文数的数(该数本身不要求是回文数)。

输入说明 :

共一行,一个单独的整数B(B用十进制表示,比如18)。

输出说明 :

每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。

注意:输出时,这两个数都应该以B进制表示。

在输出时,数字10到20分别以A到K代替。

输入范例 :
20
输出范例 :
1 1
2 4
3 9
4 G
11 121
22 484
25 515
33 9I9
DD 9669

代码

#include <stdio.h>
int main()
{
	int B,n,m;
	int ten[301];
	char num[21];
	char qu[20], st1[20],st2[20],st3[20];
	int front = 0, rear = 0, top1 = -1, top2 = -1,top3=-1;
	for (int i = 0; i < 21; i++)//进制
	{
		if (i < 10)
		{
			num[i] = '0' + i;
		}
		if (i >= 10)
		{
			num[i] = 'A' + (i - 10);
		}
	}
	for (int i = 1; i <= 300; i++)//平方
	{
		ten[i] = i*i;
	}
	scanf("%d", &B);
	for (int i = 1; i <= 300; i++)
	{
		n = ten[i];
		while (n != 0)
		{
			top1++; top2++; rear++;
			st1[top1] = st2[top2] = qu[rear] = num[n%B];
			n /= B;
		}
		while (top1 > -1)
		{
			if (st1[top1--] != qu[++front])
			{
				break;
			}
		}
		if (top1 == -1)
		{
			if (i >= B)
			{
				m = i;
				while (m != 0)
				{
					top3++;
					st3[top3] = num[m%B];
					m /= B;
				}
				while (top3 > -1)
				{
					printf("%c", st3[top3--]);
				}
				printf(" ");
				while (top2 > -1)
				{
					printf("%c", st2[top2--]);
				}
				printf("
");
			}
			else
			{
				printf("%c ", num[i]);
				while (top2 > -1)
				{
					printf("%c", st2[top2--]);
				}
				printf("
");
			}
		}
		front = 0, rear = 0, top1 = -1, top2 = -1, top3 = -1;
	}
	return 0;
}
Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
原文地址:https://www.cnblogs.com/VictorierJwr/p/12775235.html