博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【基本算法--高精度计算】回文数
阅读量:5959 次
发布时间:2019-06-19

本文共 2250 字,大约阅读时间需要 7 分钟。

【题目描述】

若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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
#include
#include
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
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;}

 

转载于:https://www.cnblogs.com/xuwanwei/p/10841867.html

你可能感兴趣的文章
第 52 章 SQL Statement Syntax
查看>>
mysql 修改表名的方法:sql语句
查看>>
JQuery实现日期联动
查看>>
eclipse让Html Javascript 自动提示
查看>>
常用网址记录
查看>>
Java的垃圾回收之算法
查看>>
利用Aspose.Word控件实现Word文档的操作
查看>>
72.8. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
通过Python处理Android API Doc离线访问
查看>>
MobaXterm连接Telnet设置方法
查看>>
I.MX6Q MfgTool2 ucl2.xml eMMC
查看>>
手把手教你使用Markdown
查看>>
iOS - Quartz 2D 贝塞尔曲线
查看>>
【基础进阶】URL详解与URL编码
查看>>
[家里蹲大学数学杂志]第425期一个定积分的计算
查看>>
[禅悟人生]责任是源自内心的自觉
查看>>
Navicat for Oracle实现连接Oracle
查看>>
windows下mysql表名不自动转换小写配置
查看>>
GitHub 不让盗版 Windows 用户登录?纯属段子
查看>>
通过shell脚本来得到不稳定的执行计划
查看>>