gejiaqia @ 2024-07-19 13:02:18
rt
#include<bits/stdc++.h>
using namespace std;
int n;
string m;
string addm;//翻转的字符串
int step=0;
int k[505],b[505],c[505];//k是s1转的数字,b是s2转的数字
string add(string s1,string s2){
memset(k,0,sizeof k);
memset(b,0,sizeof b);
memset(c,0,sizeof c);//求和数组
int l1=s1.size();
int l2=s2.size();
int l3=max(l1,l2);//和数组c的长度
for(int i=l1,j=0;i>=0;i--,j++){//反存
if(s1[i]>='0'&&s1[i]<='9'){
k[j]=s1[i]-'0';
}else{
k[j]=s1[i]-55;
}
}
for(int i=l2,j=0;i>=0;i--,j++){//反存
if(s2[i]>='0'&&s2[i]<='9'){
b[j]=s2[i]-'0';
}else{
b[j]=s2[i]-55;
}
}
int t=0;
for(int i=0;i<l3;i++){
c[i]=k[i]+b[i]+t;
t=c[i]/n;
c[i]=c[i]%n;
}
if(t){
c[l3]=1;
l3++;
}
string s3="";
for(int i=l3;i>=0;i--){
if(c[i]>='0'&&c[i]<='9'){
s3+=c[i]+'0';
}else{
s3+=char(c[i]+55);
}
}
return s3;
}
int main(){
cin>>n;
cin>>m;
string m2=m;
reverse(m.begin(),m.end());//颠倒字符串
if(m==m2){
cout<<"STEP"<<"="<<0;
}
while(1){//无限循环
addm=add(m,m2);//存一下结果
step++;//步数增加
string addm2=addm;//存数字
reverse(addm.begin(),addm.end());//颠倒
if(step>30||addm==addm2){//看是不是回文数
break;
}
m=addm;//继续加
m2=addm2;//改变一下
}
if(step>30)puts("Impossible!");
else cout<<"STEP="<<step;
return 0;
}
by beigongbaishan @ 2024-07-19 13:12:29
by ptxy2352010111 @ 2024-07-22 20:11:05
用高精度
by 120629q @ 2024-07-30 15:11:59
#include <bits/stdc++.h>
using namespace std;//大家都懂就不说了
int n;//题目中的N进制
string m;//题目中M有100位!!!必须用字符串(不太懂楼下的dalao如何做的用unsigned long long过的???求指导qwq)
int ans;
int p;
bool hw(string st)//判断是否回文
{
int ln=st.size();
for(int i=0;i<ln/2;i++)
if(st[i]!=st[ln-1-i])return 0;//若不了解这条公式,大家可以验证一下
return 1;
}
int zhuan(char x)//将字符转成数字
{
if(x>='0'&&x<='9')return int(x-48);
else//以下判断是因为有16进制
{
if(x=='A')return 10;
if(x=='B')return 11;
if(x=='C')return 12;
if(x=='D')return 13;
if(x=='E')return 14;
if(x=='F')return 15;
}
}
char zhuan_h(int x)//将数字转回字符
{
if(x>=0&&x<=9)return char(x+48);
else//和上面一样
{
if(x==10)return char('A');
if(x==11)return char('B');
if(x==12)return char('C');
if(x==13)return char('D');
if(x==14)return char('E');
if(x==15)return char('F');
}
}
string bian(string a,string b)//做加法
{
for(int i=0;i<b.size()/2;i++)//进行反转(楼下dalao用reverse(a.begin(), a.end());也是可行的,佩服)
swap(b[i],b[b.size()-1-i]);
string c="";//用来记录等会的和
int jw=0,aw=0,bw=0,cw=0;
for(int i=a.size()-1;i>=0;i--)
{
aw=zhuan(a[i]);//将a[i]转成数字
bw=zhuan(b[i]);//将b[i]转成数字
cw=(aw+bw+jw)%n;//看c字符串这一位是几
if(aw+bw+jw>=n)jw=1;//判断是否进位
else jw=0;
c=zhuan_h(cw)+c;//将这一位的数转回字符放在c字符串,注意:要放在在前面,因为是倒着算的
}
if(jw==1)c='1'+c;//千万不要忘记了最后一位还会进位
return c;//返回得出的结果
}
int main()
{
cin>>n;
cin>>m;
p=hw(m);//判断是否回文
while(p==0)
{
if(ans>30)//如果方案数>30输出“Impossible!”
{
cout<<"Impossible!";
exit(0);
}
ans++;//方案数累加
m=bian(m,m);//将M进行做加法
p=hw(m);//别忘了判断回文
}
cout<<"STEP="<<ans;//输出结果
return 0; //完美结束
}
其实我是乱写但是对了 哈哈