天天看點

USACO palindromic squares 回文數平方

題目描述

回文數是指從左向右念和從右向左念都一樣的數。如12321就是一個典型的回文數。

給定一個進制B(2<=B<=20,由十進制表示),輸出所有的大于等于1小于等于300(十進制下)且它的平方用B進制表示時是回文數的數。用’A’,’B’……表示10,11等等

輸入格式:

共一行,一個單獨的整數B(B用十進制表示)。

輸出格式:

每行兩個B進制的符合要求的數字,第二個數是第一個數的平方,且第二個數是回文數。

輸入樣例1:

10

輸出樣例1:

1 1

2 4

3 9

11 121

22 484

26 676

101 10201

111 12321

121 14641

202 40804

212 44944

264 69696

解題思路

主要就是一個進制轉換,隻要這個會了就無敵了。後面再用一個判斷回文數就OK了

進制轉換:https://blog.csdn.net/johnwayne0317/article/details/84980149

代碼

#include <bits/stdc++.h>
using namespace std;
int jin;
int a[100],c[100];
int k;
int basecnt;
int basecnt2;
char b[20]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};

void many(int n){
	k=0;
	while(n!=0){
		n/=10;
		k++;
	}
	return ;
}

//change和change2是基本一樣的,就是可以用兩個不同的數組儲存,這樣寫友善一點
void change(int n){
	basecnt=0;
	while(n!=0){
		a[basecnt]=n%jin;
		n/=jin;
		basecnt++;
	}
	return ;
}


void change2(int n){
	basecnt2=0;
	while(n!=0){
		c[basecnt2]=n%jin;
		n/=jin;
		basecnt2++;
	}
	return ;
}




int main(){
	cin>>jin;
	int tmp;
	bool tf=false;
	for(int i=1;i<=300;i++){
		memset(a,0,sizeof(a));
		memset(c,0,sizeof(c));
		//将原數與原數的平方的n進制都求出
		change2(i);
		tmp=i*i;
		change(tmp);
		} 
		many(tmp);


		//判斷回文數
		tf=false;
		for(int j=0;j<basecnt;j++){
			if(a[j]!=a[basecnt-1-j]){
				tf=true;
			}
		}

		//輸出,由于是回文數,其平方正的反的随意,也就是basecnt那個随意
		if(tf==false){
			for(int j=basecnt2-1;j>=0;j--){
				cout<<b[c[j]];
			}
			cout<<" ";
			for(int j=basecnt-1;j>=0;j--){
				cout<<b[a[j]];
			}
			cout<<endl;
		}
	}
	return 0;
}