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


    【题目描述】

    若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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;
    }
  • 相关阅读:
    C#关于日期 月 天数 和一年有多少周及根据某年某周获取时间段的计算
    配置tomcat
    C# 动态编译及反射执行
    数据库日志自增量太大导致超时
    validateRequest验证引发错误“检测到有潜在危险的 Request.Form 值”
    入手了DELL Ultrabook,还不错哦!
    Spring.NET学习笔记1——控制反转(基础篇)
    Win7 64位下Kindle4、闪迪Cruzer BladeU盘等无法安装驱动问题的解决方法
    转:CentOS 5.5下LVM分区在线扩容
    [转]关于64位Sublime Text 2破解注册码的方法
  • 原文地址:https://www.cnblogs.com/xuwanwei/p/10841867.html
Copyright © 2020-2023  润新知