题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数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
#include <iostream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <climits>
#include <stdio.h>
#include <iomanip>
#include <math.h>
#include <list>
#include <queue>
#include <tuple>
#include <stack>
#include <string.h>
using namespace std;
string addStrings(string num1, string num2, int n)
{
int size1 = num1.size();
int size2 = num2.size();
if(size2 < size1)
{
for(int i = 0; i < (size1-size2)+1; i++)
num2 = '0'+num2;
num1 = '0'+num1;
}
else if(size1 < size2)
{
for(int i = 0; i < (size2-size1)+1; i++)
num1 = '0'+num1;
num2 = '0'+num2;
}
else
{
num1 = '0'+num1;
num2 = '0'+num2;
}
int size = max(size1, size2);
int i = 0;
int jinwei = 0;
string ret;
for(i = size; i >= 0; i--)
{
int a;
if(num1[i] >= '0' && num1[i] <= '9')
a = num1[i] - '0';
else
a = num1[i] - 'A' + 10;
int b;
if(num2[i] >= '0' && num2[i] <= '9')
b = num2[i] - '0';
else
b = num2[i] - 'A' + 10;
int sum = a + b + jinwei;
if(sum >= n)
jinwei = 1;
else
jinwei = 0;
sum %= n;
if(sum >= 10 && sum <= 16)
{
switch(sum)
{
case 10:
{
ret = 'A' + ret;
break;
}
case 11:
{
ret = 'B' + ret;
break;
}
case 12:
{
ret = 'C' + ret;
break;
}
case 13:
{
ret = 'D' + ret;
break;
}
case 14:
{
ret = 'E' + ret;
break;
}
case 15:
{
ret = 'F' + ret;
break;
}
}
}
else
ret = std::to_string(sum) + ret;
}
if(ret[0] == '0')
ret.erase(0,1);
return ret;
}
bool ishuiwen(string str)
{
int left = 0;
int right = str.size()-1;
while(left <= right)
{
if(str[left] != str[right])
return false;
left++;
right--;
}
return true;
}
int main(void)
{
int n;
string nums;
cin >> n >> nums;
int count = 0;
while(count <= 30)
{
count++;
string copy = nums;
reverse(copy.begin(), copy.end());
nums = addStrings(nums, copy, n);
//cout << nums << endl;
if(ishuiwen(nums))
{
cout << "STEP=" << count << endl;
return 0;
}
}
cout << "Impossible!" <<endl;
return 0;
}