题目描述:
若一个数(首位不为零)从左向右读与从右向左读都同样,咱们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把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(100位以内),求最少通过几步能够获得回文数。若是在30步之内(包含30步)不可能获得回文数,则输出“Impossible!”c++
输入格式:
两行,分别是N,M。数组
输出格式:
STEP=ansmarkdown
输入样例:
10
87
输出样例:
STEP=4函数
难度:简单ui
这道题主要考查两点:reverse和check。
将数存成数组的形式(也就是高精度的写法),reverse就很好写(swap一下)。this
源代码以下:spa
/* About: luogu_P1015_回文数 Auther: kongse_qi Date:2017/04/21 */
#include <bits/stdc++.h>
#define maxn 10005
using namespace std;
int Base, times;
string n;
struct qi
{
int len, s[maxn], base;
qi ()//初始化结构体
{
memset(s, 0, sizeof s);
len = 0;
base = Base;
}
qi (string a, int b)//也是初始化(用于输入)
{
len = a.size();
for(int i = 0; i < len; i++)
{
if(a[len-1-i] >= 'A')
{
s[i] = a[len-i-1] -'A'+10;
}
else
{
s[i] = a[len-i-1] -'0';
}
}
base = b;
}
qi operator + (const qi &b)//+
{
qi c;
c.len = 0;
for(int i = 0, g = 0; g || i < max(len, b.len); i++)
{
int x = g;
if(i < len) x += s[i];
if(i < b.len) x += b.s[i];
c.s[c.len++] = x % base;
g = x / base;
}
return c;
}
qi operator = (const qi &x)//复制
{
len = x.len;
for(unsigned i = 0; i != len; ++i)
{
s[i] = x.s[i];
}
base = x.base;
}
qi operator += (const qi &x)//就是作上面写好的"+"
{
*this = *this+x;
return *this;
}
void reverse()//反转
{
for(unsigned i = 0; i != len/2; ++i)
{
swap(s[i], s[len-1-i]);
}
return ;
}
}x,y;
void Init()
{
scanf("%d", &Base);
cin >> n;
x = qi(n, Base);
return ;
}
bool check(const qi &a)
{
for(unsigned i = 0; i != a.len/2; ++i)
{
if(a.s[i] != a.s[a.len-i-1]) return false;
}
return true;
}
void Add()
{
do
{
y = x;//copy
x.reverse();//结构体函数
x += y;
++times;
}
while(!check(x) && times < 31);
if(times < 31)
{
cout << "STEP=" << times;
}
else
{
cout <<"Impossible!";
}
return ;
}
int main()
{
Init();
Add();
return 0;
}
高精度模板.net
自此完成。
箜瑟_qi 2017.04.21 12:17code