时间限制: 1Sec 内存限制: 128MB
20200302重新写了一遍,思路清晰多了
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个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<=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入
共两行
第一行为进制数N(2<=N<=16)
第二行为N进制数M(0<=M<=maxlongint)
输出
共一行,为“STEP=经过的步数”或“Impossible!”
样例输入
9
87
样例输出
STEP=6
Codes&Analysis
Function
对于Convert
功能:将该数组中的数全部转化为n进制的数
参数:数组A,整型n分别代表这个数为n进制的数。
数组A的处理:A[0]
存储这个数的位数。
循环:每一次循环将当前位置的数转化为<n
的数。
注意:转化的时候需要进行整除和取余两步操作,整除为进位,取余为当前位置应该为的数。
对于AddtoJudge
功能:首先对数组进行逆位相加,然后Convert
处理,再进行判断是否是回文数
参数:同上
逆位相加:两个循环变量,分别从首尾向中间靠拢,当该数为偶数位的时候正好进行逆位相加,但是为奇数位的时候,中间位数字没有进行加倍操作,需要单独处理
逆位相加的操作有两种方法。在最下面进行说明
回文数判断:和逆位相加的原理相同,不再赘述
BUG
1、进行输入的时候,N为进制数,M为输入的N进制的数,进行存入数组的时候,为进行依次取位处理。
注意:取位处理无论是多少进制(大于10进制的,全部转化位int型存储在数组中),都是进行10进制的整除、取余处理。
2、进行逆位相加的时候,对当前数的位数处理不精确,并没有进行奇偶数区分处理
Code 0 原始版本
1、首先将整数n转化为数组,然后将数组从首至尾进行相加(注意数组中的值在相加的时候并不会改变)
2、然后再进行转换,转换的作用是将数组中每个元素都规范化,连在一起等于一个整数
3、最后进行判断是否是回文数。
关键是数组的首位相加,一种是进行数组元素个数是否是奇数,是奇数则增加循环个数;另一种在循环外进行判断,单独对中间数进行处理。
#include<stdio.h>
void Convert(int A[],int n)
{
//整理当前数组,确保为n进制数的正确表示
int i;
for(i=1;i<=A[0];i++){
if(A[i]>=n){
A[i+1]+=A[i]/n;
A[i]%=n;
if(i==A[0]) A[0]++;
}
}
}
int AddtoJudge(int A[],int n)
{
int i,j,t,k=A[0]/2;
for(i=1,j=A[0];i<=k