【思维题】与进制数关联的回文数

简介: 【思维题】与进制数关联的回文数

问题描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数

  例如:给定一个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(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。

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

输入格式

两行,N与M 输出格式

  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)

样例输入

9

87

样例输出

STEP=6


思路:

先给定一个n进制数m

然后把m反过来再加上他自己作为下一个数,直到是回文数为止

最后返回step,如果大于30,打印impossible!
难点: 9进制、3进制……怎么实现?如果不是10进制,加减法其实很难在程序中写出来

第一步: 把这个数转化成10进制

注意:在转化之前我们需要先把这个数反过来,因为我们比的是这个进制的数而不是转化为10进制之后的数

第二步: 转化之后相加,之后再转化为这个进制的数,然后判断它是否是回文数。

如果是,输出结果,如果不是,重复第一步……
代码:

import java.util.Scanner;
public class HuiWenShu {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();// n进制
    String m = sc.next();// n进制数m(以字符串形式输入,方便操作)
    int count = 0;
    while (!isHuiWen(m)) {
      String temp = reverse(m);//先将其反转
      //将其本身和反转之后的进制数转化为10进制
      long s1 = Long.valueOf(m, n);
      long s2 = Long.valueOf(temp, n);
      long s3 = s1 + s2;//两个数相加
      //再转化为10进制作为下一次循环所用的数
      m = Long.toString(s3, n);
      if (count++ > 30) {
        System.out.println("Impossible!");
        break;
      }
    }
    if (count <= 30) {
      System.out.println("STEP=" + count);
    }
  }
  //字符串的反转
  private static String reverse(String m) {
    StringBuilder builder = new StringBuilder(m);//转换为StringBuilder提高效率
    StringBuilder builder2 = builder.reverse();
    return new String(builder2);//返回的还是String类型
  }
  //判断是否是回文数
  private static boolean isHuiWen(String m) {
    for(int i = 0,j = m.length() - 1;i <= j;i++,j--) {
      if(m.charAt(i) != m.charAt(j)) {
        return false;
      }
    }
    return true;
  }
}
相关文章
|
8月前
|
Python
如何判断一个数是质数? 要求:编写一个Python函数,输入一个整数,输出该整数是否为质数。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。
如何判断一个数是质数? 要求:编写一个Python函数,输入一个整数,输出该整数是否为质数。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。
397 1
|
8月前
48.输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)
48.输入任意正整数,编程判断该数是否为回文数(回文数是指从左到右读与从右到左读一样,如12321)
67 0
|
8月前
|
小程序 C语言
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
【C语言】输入一个十进制正整数,将它对应的二进制数的各位逆序,形成新的十进制数输出。题目分析及拓展应用。
123 0
|
算法 搜索推荐 程序员
C语言第十三练——输入一个正整数,判断这个数是否是素数
C语言第十三练——输入一个正整数,判断这个数是否是素数
139 0
|
C语言
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
176 0
|
算法 C语言
C语言典型例题1——水仙花数
水仙花数 水仙花数的含义: “水仙花数”是一个三位数其各位数字的立方和等于该数本身。例如:153=111+555+333
201 0
|
算法
求两个数对应二进制位不同的个数(深度剖析+补充例题)
求两个数对应二进制位不同的个数(深度剖析+补充例题)
186 0
求两个数对应二进制位不同的个数(深度剖析+补充例题)
|
Java 测试技术
Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
223 0
Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
【C语言】(错题整理) 寻找完数、字符串中各类字符数的统计、最大公约数和最小公倍数、回文数计算 (循环、函数相关内容)
本篇博客旨在整理最近在头歌遇到的难题、错题,对其进行分析并整理。 一、循环 1.寻找完数(计算因子例题) 一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出1000之内的所有完数。 这道题的首要任务就是找到各个数的因子,然后再对其进行判断。那么计算这个数的因子,我们可以用循环,试每个小于它的数对其进行求余%,结果为零即是因子。
|
Java
编写Java程序_输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
编写Java程序_输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
435 0
编写Java程序_输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

热门文章

最新文章