【基本算法--高精度计算】回文数

【题目描述】

若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。

【输入】

给定一个N(2<N<=10或N=16)进制数M。

【输出】

最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。

【输入样例】

9 87

【输出样例】

6

【注意】
  1. string s; cin>>s;  要加入头文件 #include<string>
  2. 要注意终止条件,临界的时候,特别是要看看是不是有‘=’;
  3. 注意有时候处理下一个数的时候,要看清到底是+=还是=,否则会导致原本的值被改变
  4. n进制的计算只需要同位计算之后,用n进制的方法处理该位应该有的数和进位就可以了,不需要全部化为十进制
  5. 如果两个数是不同的进制的时候,再考虑用全部化为十进制

【代码】

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int n, a[101], b[101], ans, i;
void initial(int a[])
{
    string s;
    cin >> n >> s;    //使用cin>>s, s为string类型时,要添加头文件#include<string>
    a[0] = s.length();
    for (int i = 1; i <= a[0]; i++)
    {
        if (s[a[0] - i] >= '0'&&s[a[0] - i] <= '9')        //注意要从s逆序输入到a数组中,便于加法计算 
        {
            a[i] = s[a[0] - i] - '0';
        }
        else
            a[i] = s[a[0] - i] - 'A' + 10;    //注意这里还要加10 
    }
}
bool judge(int a[])
//判断是否是回文数,不需要转到十进制再判断
//直接用原本的数比较就可以了
//因此前面转换到a数组的时候
//只需要把a b c...f转成数字便于储存
//而不需要把她们进位 
{
    for (int i = 1; i <= a[0]; i++)
    {
        if (a[i] != a[a[0] - i + 1])
            return false;
    }
    return true;
}
//n进制的计算,不需要全部化为10进制再计算,再化为n进制
//可以直接每位计算之后,再进行处理
//因为实际上区别是每一位的最大值
//十进制 %10, n进制 %n;
//进位 十进制 /10, n进制/n; 
void Add(int a[])
{
    b[0] = a[0];
    for (int i = 1; i <= a[0]; i++)
    {
        b[i] = a[a[0] - i + 1];
    }
    for (int i = 1; i <= a[0]; i++)    //注意以1开始,那么终止条件是有等号的,注意终止条件 
    {
        a[i] += b[i];
    }
    for (int i = 1; i <= a[0]; i++)    //处理进位 
    {
        a[i + 1] += a[i] / n;    //这里千万要注意!!a[i+1]本身也可能是有值的,不能直接覆盖,而是要+=
        a[i] %= n;
    }
    if (a[a[0] + 1] != 0)
        a[0]++;
}
int main()
{
    initial(a);
    if (judge(a))
    {
        cout << 0 << endl;
        return 0;
    }
    ans = 0;
    while (ans <= 30)
    {
        ans++;
        Add(a);
        if (judge(a))
        {
            cout << ans << endl;
            return 0;
        }
    }
    cout << "Impossible" << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xuwanwei/p/10841867.html