问题 1161: 【回文数(二)】【Right】【数组模拟加法】【修正】

博客详细讨论了回文数的问题,包括问题的描述、代码实现与分析、错误修复以及修正版代码。作者通过数组模拟加法,解决了N进制数转化为回文数的步骤计算,特别强调了处理奇偶位和逆位相加的细节。
摘要由CSDN通过智能技术生成

时间限制: 1Sec 内存限制: 128MB
20200302重新写了一遍,思路清晰多了


我是智障啊我,找了一年的BUG才发现是读题出现问题

题目描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值