題目描述:
若一個數(首位不爲零)從左向右讀與從右向左讀都同樣,咱們就將其稱之爲迴文數。
例如:給定一個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