华师一附中OI组
标题:
P1015 回文数
[打印本页]
作者:
admin
时间:
2018-5-26 20:39
标题:
P1015 回文数
https://www.luogu.org/problemnew/show/P1015
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数 5656 ,将 5656 加 6565 (即把 5656 从右向左读),得到 121121 是一个回文数。
又如:对于十进制数 8787 :
STEP1: 8787 + 7878 = 165165
STEP2: 165165 + 561561 = 726726
STEP3: 726726 + 627627 = 13531353
STEP4: 13531353 + 35313531 = 48844884
在这里的一步是指进行了一次 NN 进制的加法,上例最少用了 44 步得到回文数 48844884 。
写一个程序,给定一个 NN ( 2 \le N \le 10,N=162≤N≤10,N=16 )进制数 MM ( 100100 位之内),求最少经过几步可以得到回文数。如果在 3030 步以内(包含 3030 步)不可能得到回文数,则输出Impossible!
输入输出格式
输入格式:
两行,分别是 NN , MM 。
输出格式:
STEP=ans
输入输出样例
输入样例#1:
10
87
输出样例#1:
STEP=4
作者:
admin
时间:
2018-7-23 20:49
#include<iostream>
using namespace std;
int N;
string M;
string rever(string s)
{
int i,l=s.size();
string t="";
for (i=0; i<=l-1; i++) t=s[i]+t;
return t;
}
string add(string s,string t)
{
int x,j,i,l1=s.size(),l2=t.size();
int x1,x2;
if (l1<l2)
{
swap(s,t);
swap(l1,l2);
}
for (i=1; i<=l1-l2; i++) t='0'+t;
string ss="";j=0;
for (i=l1-1; i>=0; i--)
{
if (s[i]<='9')x1=s[i]-'0';else x1=s[i]-'A'+10;
if (t[i]<='9')x2=t[i]-'0';else x2=t[i]-'A'+10;
x=x1+x2+j;
if (x>=N)
{
x=x-N;
j=1;
}
else j=0;
if (x<=9)ss=char(x+'0')+ss;
else ss=char(x-10+'A')+ss;
}
if (j==1) ss='1'+ss;
return ss;
}
string trim(string s)
{
string t=s;
while (t[0]=='0' && t.size()>1) t.erase(0,1);
return t;
}
int main()
{
int i;
cin>>N;
cin>>M;
for(i=0; i<=30; i++)
{
///cout<<M<<endl;
string sm=rever(M);
/// cout<<sm<<endl;
if (M==sm) break;
else
{
M=add(M,sm);
M=trim(M);
}
}
if (i<=30) cout<<"STEP="<<i;
else cout<<"Impossible!";
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2