|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目描述
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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)进制数 M(低于100位).求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。
输入
给定一个N(2<N<=10或N=16)进制数M。
输出
最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。
样例输入
9 87
样例输出
6
我的代码:
#include<bits/stdc++.h>
using namespace std;
//定义N进制回文加法函数(2 <= N <= 10)
string func1(int N, string s1){
int len, lc, i;
string answer = "";
string s2 = s1;
reverse(s2.begin(), s2.end());
int a[102] = {}, b[102] = {}, c[102] = {};
len = s1.size();
lc = len + 1;
for (i=0; i<len; i++){
a[i+1] = s1[i] - '0';
b[i+1] = s2[i] - '0';
}
for (i=1; i<=lc; i++) c[i] = a[i] + b[i];
for (i=lc; i>= 1; i--){
c[i-1] += c[i] / N;
c[i] = c[i] % N;
}
for (i=lc; i>= 1; i--){
answer = char(c[i] + 48) + answer;
}
if (c[0] != 0) answer = '1' + answer;
}
//回文数判断函数
bool func2(string s1){
string s2 = s1;
reverse(s2.begin(), s2.end());
if (s1 == s2) {
return true; //是回文数
} else {
return false; //不是回文数
}
}
//主程序
int main(){
int N, i, count = 0;
string s, he;
cin >> N >> s;
he = func1(N, s);
while ((not func2(he)) && (count <= 30)) {
he = func1(N, he);
count++;
}
if (count > 30){
cout << "Impossible";
} else {
cout << count;
}
return 0;
} |
|