【题解】P1015 回文数

题面

题目传送门

前言

好无聊的高精度

正文

需要维护两个操作

  1. 高精度加法

  2. 倒转字符串(判断回文、和加法操作都需要捏!)

代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110;
char sixt[20]="0123456789ABCDEF";
int n;
string m;
inline bool check(string a){
	string s=a;
	reverse(s.begin(),s.end());
	return s==a;
}
string add(int k,string b){
	string a=b;
	reverse(a.begin(),a.end());
	int numa[maxn]={},numb[maxn]={},numc[maxn]={};
	int len=a.length(),lenc=1;
	string ans;
	for(int i=0;i<len;i++){
		if(isdigit(a[i])){
			numa[len-i]=a[i]-'0';
		}else{
			numa[len-i]=a[i]-'A'+10;
		}
		if(isdigit(b[i])){
			numb[len-i]=b[i]-'0';
		}else{
			numb[len-i]=b[i]-'A'+10;
		}
	}
	int x=0;
	while(lenc<=len){
		numc[lenc]=numa[lenc]+numb[lenc]+x;
		x=numc[lenc]/k;
		numc[lenc]%=k;
		lenc++;
	}
	numc[lenc]=x;
	while(numc[lenc]==0){
		lenc--;
	}
	for(int i=lenc;i>=1;i--){
		ans+=sixt[numc[i]];
	}
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=0;i<=30;i++){ 
		if(check(m)){
			cout<<"STEP="<<i<<endl;
			return 0;
		}else{
			m=add(n,m);
		}
	}
	cout<<"Impossible!"<<endl;
	return 0;
}

后记

又双叒叕水过一篇题解!

完结撒花!

posted @ 2024-12-23 12:55  sunxuhetai  阅读(7)  评论(0)    收藏  举报