每日一题 - - 12(2023.4.4)

说明

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加56(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
    STEP1:87+78  = 165                    STEP2:165+561 = 726
    STEP3:726+627 = 1353                STEP4:1353+3531 = 4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

输入格式

每个测试文件只包含一组测试数据,每组输入一个N(2<=N<=10,N=16)进制数M,每组的第一行输入N,第二行输入M。

输出格式

对于每组输入数据,输出最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出"Impossible!"。

样例

输入数据 1

9
87

输出数据 1

STEP=6

思路:直接暴力模拟

代码如下:

#include
using namespace std;
const int N = 1e5;
int n, len;
int a[N], sum[N];
string s;
int sz(char ch){
	if(ch >= '0' && ch <= '9'){
		return ch - '0'; 
	} else{
		if(ch == 'a' || ch == 'A')	return 10; 
		else if(ch == 'b' || ch == 'B')	return 11;
		else if(ch == 'c' || ch == 'C')	return 12;
		else if(ch == 'd' || ch == 'D') return 13;
		else if(ch == 'e' || ch == 'E') return 14;
		else if(ch == 'f' || ch == 'F') return 15;
	}
}

int main()
{
	cin >> n >> s;
	int len = s.length();
    //将字符串装入整型数组中,便于加进制操作
	for(int i = 0; i < s.length(); i++){
		a[i + 1] = sz(s[i]);
	}
    //判断初始是否为回文数
	int flag0 = 0;
	for(int i = 1, j = len; i <= j; i++, j--){
		if(a[i] != a[j]){
			flag0 = 1;
		}
	}
	if(flag0 == 0){
		cout << 0 << endl;
		return 0;
	}
    
    //开始加进制以及判断
	int cnt = 1;
	while(cnt <= 30){

        //加进制操作
		for(int i = 1; i <= len; i++){
			sum[i] = a[i] + a[len - i + 1];	//先把每位加起来 
		}
		for(int i = 1; i < len; i++){	//先将前 len - 1 的进位处理了 
			sum[i + 1] += sum[i] / n;	 
			sum[i] %= n; 
		}

        //处理可能位数增加问题 
		if(sum[len] >= n){	
			len++;
			sum[len] = sum[len - 1] / n;
			sum[len - 1] %= n;
		}
        
        //判断是否回文
		int flag = 0;
		for(int i = 1, j = len; i <= j; i++, j--){
			if(sum[i] != sum[j]){
				flag = 1;
				break;
			}
		}
		if(flag == 0){
			cout << "STEP=" << cnt << endl;
			return 0;
		}

        //将加进制后的数组重新赋给a数组
		for(int i = 1; i <= len; i++){
			a[i] = sum[i]; 
		} 
        //sum数组清零
		memset(sum, 0, sizeof sum);
        //步数+1
		cnt++;
	}
	cout << "Impossible!" << endl;
	return 0;	
} 

你可能感兴趣的:(算法,c++,图论)