回文数(4月4日)
- ID: 83传统题1000ms125MiB尝试: 91已通过: 11难度: 8上传者:田维方 (GMU_TWF)标签>
说明
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个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
Copy
输出数据 1
STEP=6
个人题解:
#include<bits/stdc++.h>
using namespace std;
string str;
long long abb(long long a,int b)//其他进制转十进制,方便运算
{
long long ans=0,i=0;
while(a)
{
int q=a%10;
q*=pow(b,i);
i++;
a/=10;
ans+=q;
}
return ans;
}
long long add(long long a,int n)//不满足条件,相加其回文数
{
int ans=0,w=a,q;
while(a)
{
q=a%10;
ans=ans*10+q;
a/=10;
}
int r=abb(ans,n)+abb(w,n);
return r;//其他进制换位后转十进制
}
char jzzh(long long x)//单一数字进制转换
{
if(x<=9) return x+'0';//正常数字不需要转换
return x-10+'A';//将取余数单独转换为对应大写字母
}
string zhzfc(long long n,int b)//转换进制后的字符串(数字)
{
string num;
while(n)
{
num+=jzzh(n%b);//取余转换
n/=b;
}
reverse(num.begin(),num.end());//运用reverse函数将字符串倒转
return num;
}
bool panduan(string num)//判断是否为回文数
{
for(int i=0,j=num.length()-1;i<j;i++,j--)
if(num[i]!=num[j]) return false;//判断对称相等
return true;
}
long long aqq(string str)
{
int q=str.length(),ans;
for(int i=0;i<q;i++)
{
ans=ans*10+str[i]-'0';
}
return ans;
}
int main()
{
long long n,m,r,q=0;
cin>>n>>m;
m=abb(m,n);
str=zhzfc(m,n);
for(int i=1;i<=30;i++)
{
if(panduan(str))
{
//cout<<str<<" ";
cout<<"STEP="<<i-1;
return 0;
}
m=aqq(str);
//cout<<m<<" ";
m=add(m,n);
long long e=m;
str=zhzfc(e,n);
cout<<str<<" ";
}
cout<<"Impossible!";
return 0;
}