题目要求

P1015题目链接

分析

开始的时候写了这么一个代码,应该是比较基础的,是十进制的。

    private static void low() {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();String str = Integer.toString(num);int i;for (i = 0 ; i < 30; i++) {StringBuilder reverse = new StringBuilder(str).reverse();//是回文数if (str.equals(reverse.toString())) {break;}//不是回文数,就增加数值num += Integer.parseInt(reverse.toString());str = Integer.toString(num);}if (i == 30) {System.out.println("Impossible!");} else {System.out.println("STEP=" + i);}scanner.close();}

但本题是N进制的,数据要求是 2 <= N <= 10 || N == 16 。

要将十六进制和N进制区分开来,分情况讨论。

十六进制的话,在我们使用char的时候,由于大写字母与阿拉伯数字在ASCII里是不连续的,所以我觉得可以建立一个Integer与Character之间的双射关系。
双射关系的“一一对应”不是很容易实现,那就可以建立两个HashMap,一个从Integer到Character,另一个从Character到Integer,利用HashMap的高效性来快速的存取。

读题的话,字符串反转是要做的。
Java不像C,貌似没有直接的reverse(),但可以使用StringBuilder实现:

    /*** 字符串反转* @param string 待翻转字符串* @return 翻转后的字符串*/private static String reverse(String string) {return new StringBuilder(string).reverse().toString();}

还要做回文判定,既然有了reverse,那就直接利用String的equals()即可。二者结合就可以判定是否是回文数啦:

    /*** 判断是否为回文数* @param num 待判数值* @return 是否为回文数*/private static boolean isPalindrome(String num) {if (num.equals(reverse(num))) {return true;} else {return false;}}

核心是如何操作至多100位的加法呢?(虽然洛谷里本题评测数据没那么变态)
只能是纯粹的利用串和字符进行加法,这也是核心的难点。

下面是十六进制的加法:

    /*** 十六进制加法* @param num1 加数1* @param num2 加数2(位数与加数1相同)* @return 十六进制和*/private static String hexAdd(String num1, String num2) {//获取char[]char[] chars1 = num1.toCharArray();char[] chars2 = num2.toCharArray();//长度int length = chars1.length;//结果的char[]char[] result = new char[length+1];for (int i = length-1; i >= 0; i--) {//实际上是intint temp = charMap.get(chars1[i]) + charMap.get(chars2[i]) + result[i+1];if (temp >= 16) {//本位溢出,进位result[i+1] = intMap.get(temp-16);result[i]++;} else {result[i+1] = intMap.get(temp);}}//最终溢出if (result[0] == 0) {return new String(result).substring(1);}result[0] += 48;return new String(result);}

因为是有A/B/C/D/E/F,但上面也说了原因,这是不好操作的,就利用Map的映射来获取对应的“真值”。

原本想的是先判进位,但是后来发现不行,下面打个比方:
如果先判高位相加时候溢出,是不能满足所有可能的,很多测试数据用上去都会WA掉。
十进制的599+499,明显是会溢出进位的,但5+4不会达到10,如果这就认为不能满足进位,显然就错了。

所以我会开一个长一位的数组,当高位是0的时候(不进位)就利用字符串的取得子串来消去第一位。

进位一定要处理好啊!!!

下面是2~10进制的加法:

    /*** 2-10进制的加法* @param num1 加数1* @param num2 加数2(位数与加数1相同)* @param format 两个数所属进制* @return N进制和(2 <= N <= 10)*/private static String normallyAdd(String num1, String num2, int format) {//获取char[]char[] chars1 = num1.toCharArray();char[] chars2 = num2.toCharArray();//长度int length = chars1.length;//结果的char[]char[] result = new char[length+1];for (int i = length-1; i >= 0; i--) {//实际上是charint temp = chars1[i] + chars2[i] + result[i+1];if (temp >= 96 + format) {//本位溢出,进位result[i+1] = (char)(temp - format - 48);result[i]++;} else {result[i+1] = (char)(temp - 48);}}//最终溢出if (result[0] == 0) {return new String(result).substring(1);}result[0] += 48;return new String(result);}

这里就可以不用Map啦,其实单纯的操作char就可以啦!!

很多都是类似的,可以看看上面的。

评测数据集Share

我遇到了一些WA和RE问题。
一共有4份测试数据集,我这里有第一个、第二个、第四个。

数据1
in
2
10011

out
STEP=4

数据2
in
16
AC27

out
STEP=6

数据4
in
2
101111

out
Impossible!

AC代码(Java语言描述)

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Main {private static Map<Character, Integer> charMap;private static Map<Integer, Character> intMap;static {charMap = new HashMap<>();charMap.put('0', 0);charMap.put('1', 1);charMap.put('2', 2);charMap.put('3', 3);charMap.put('4', 4);charMap.put('5', 5);charMap.put('6', 6);charMap.put('7', 7);charMap.put('8', 8);charMap.put('9', 9);charMap.put('A', 10);charMap.put('B', 11);charMap.put('C', 12);charMap.put('D', 13);charMap.put('E', 14);charMap.put('F', 15);intMap = new HashMap<>();intMap.put(0, '0');intMap.put(1, '1');intMap.put(2, '2');intMap.put(3, '3');intMap.put(4, '4');intMap.put(5, '5');intMap.put(6, '6');intMap.put(7, '7');intMap.put(8, '8');intMap.put(9, '9');intMap.put(10, 'A');intMap.put(11, 'B');intMap.put(12, 'C');intMap.put(13, 'D');intMap.put(14, 'E');intMap.put(15, 'F');}/*** 字符串反转* @param string 待翻转字符串* @return 翻转后的字符串*/private static String reverse(String string) {return new StringBuilder(string).reverse().toString();}/*** 十六进制加法* @param num1 加数1* @param num2 加数2(位数与加数1相同)* @return 十六进制和*/private static String hexAdd(String num1, String num2) {//获取char[]char[] chars1 = num1.toCharArray();char[] chars2 = num2.toCharArray();//长度int length = chars1.length;//结果的char[]char[] result = new char[length+1];for (int i = length-1; i >= 0; i--) {//实际上是intint temp = charMap.get(chars1[i]) + charMap.get(chars2[i]) + result[i+1];if (temp >= 16) {//本位溢出,进位result[i+1] = intMap.get(temp-16);result[i]++;} else {result[i+1] = intMap.get(temp);}}//最终溢出if (result[0] == 0) {return new String(result).substring(1);}result[0] += 48;return new String(result);}/*** 2-10进制的加法* @param num1 加数1* @param num2 加数2(位数与加数1相同)* @param format 两个数所属进制* @return N进制和(2 <= N <= 10)*/private static String normallyAdd(String num1, String num2, int format) {//获取char[]char[] chars1 = num1.toCharArray();char[] chars2 = num2.toCharArray();//长度int length = chars1.length;//结果的char[]char[] result = new char[length+1];for (int i = length-1; i >= 0; i--) {//实际上是charint temp = chars1[i] + chars2[i] + result[i+1];if (temp >= 96 + format) {//本位溢出,进位result[i+1] = (char)(temp - format - 48);result[i]++;} else {result[i+1] = (char)(temp - 48);}}//最终溢出if (result[0] == 0) {return new String(result).substring(1);}result[0] += 48;return new String(result);}/*** 判断是否为回文数* @param num 待判数值* @return 是否为回文数*/private static boolean isPalindrome(String num) {if (num.equals(reverse(num))) {return true;} else {return false;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//进制(2-10、16)int format = Integer.parseInt(scanner.nextLine());String num = scanner.nextLine();int counter = 0;if (format == 16) {while (!isPalindrome(num) && counter <= 30) {num = hexAdd(num, reverse(num));counter++;}} else {while (!isPalindrome(num) && counter <= 30) {num = normallyAdd(num, reverse(num), format);counter++;}}if (counter > 30) {System.out.println("Impossible!");} else {System.out.println("STEP=" + counter);}scanner.close();}}

感悟

这个题的代码基本写了半天,充满了各种失败,是很大的挑战。

但这次以后,我想我对利用串和字符处理进制有了很好的认识,这部分内容对我是重要的,以后希望能做得更好。

希望能对大家有所帮助!!
加油!!奥利给!!(晚安啦)

N进制正反累加判回文数(洛谷P1015题题解,Java语言描述)相关推荐

  1. 【Python 百炼成钢】进制转换、特殊回文数、水仙花数、杨辉三角、字母图形、01字符串、回形取数、排他方数、世纪末的星期日、约瑟夫环

    文章目录

  2. php判断一个数是否是回文数,每周一道算法题001:回文数

    题目: 找出大于10的最小的2进制,8进制,10进制都是回文数的最小的数.回文数指的是正读和反读都是一样的数,例如:33,10001,123454321... 思路: 先转换进制,然后统一处理成字符串 ...

  3. N进制的规范十进制表示(洛谷P2084题题解,Java语言描述)

    题目要求 P2084题目链接 分析 神之水题,神之水题--无非是最基本的进制转换罢了-- 说好的进制转换在哪里?,把一个正数的N进制变成规范的表示? 醉了--用StringBuilder,最后消去开头 ...

  4. 回文质数(洛谷P1217题题解,Java语言描述)

    题目要求 P1217题目链接 分析 看一眼标签--"高性能",一口老血喷出来-- 正好最近正式学习了神奇的技能--打表,哈哈哈,那就用一用吧-- 首先我默认读者会回文数和质数的判断 ...

  5. 不怂Java进制转换(洛谷P1143题题解,Java语言描述)

    感慨 Java也能这么好使啊,不容易-- --进阶的JFarmer 题目要求 P1143题目链接 分析 进制转换其实也还好,但既然用了Java,那就得扬眉吐气一次,体会体会利用API轻松秒题的感受,机 ...

  6. 暴力枚举——回文质数(洛谷 P1217)

    题目选自洛谷P1217 此题异常的坑,需要很多的处理和简化: 1.回文质数一定不是2的倍数,因为质数不可能是2的倍数: 2.最大的回文质数是9989899(自己测). 于是,本蒟蒻的代码就出来了 题目 ...

  7. java判断五位数回文数_【视频+图文】Java经典基础练习题(五):键盘输入一个五位数,判断这个数是否为回文数...

    能解决题目的代码并不是一次就可以写好的 我们需要根据我们的思路写出后通过debug模式找到不足再进行更改 多次测试后才可得到能解决题目的代码! 通过学习,练习[Java基础经典练习题],让我们一起来培 ...

  8. 回文数(牛客练习赛71)题解

    题目描述 Froggy 分别给出 10 个数码的出现次数,你需要找到一个由这些数码组成的最小的数,满足: 1. 这个数是回文的. 2. 不能有前导 0. 注:假设这个数字长度是 LL,那么这个数是回文 ...

  9. C语言中判断回文数用数组的方法,【C语言】回文数和回文字符串的判断

    一.名词解释: 如果一个数正着反着都是一样,就称为这个数是回文数.例如:6, 66, 606, 6666 同理如果一个字符串正着反着都是一样就称为这个字符串是回文字符串,例如"aba&quo ...

最新文章

  1. Suricata的输出
  2. Android设计模式系列(3)--SDK源码之单例模式
  3. 【机器学习入门笔记15:BP神经网络逼近股票收盘价格2】20190218
  4. 让我们的标签语义化成为一种习惯好处多多
  5. java的md5盐值加密_MD5盐值加密
  6. C++:47---绝不重新定义继承而来的缺省参数值
  7. KeyError: ‘segment_ids paddlehub中出现segement_ids错误解决方案
  8. golang 切片追加问题
  9. NLP文本分类大杀器:PET范式
  10. 使用Apache commons-pool2实现高效的FTPClient连接池的方法
  11. 打java包需要对应服务器么_java打war包、部署服务器
  12. 为什么要学习Windows程序设计?
  13. 西安市行政区划矢量图_行政区划图片下载_行政区划图矢量图素材
  14. JS代码压缩混淆工具使用说明
  15. html中css鼠标经过事件,css中鼠标点击变色 css里鼠标悬停变色怎么弄
  16. 鹏业安装算量软件一键识别设备操作说明
  17. Pandas学习——文本数据
  18. python 封包发包_python中封包建立过程实例
  19. sybil attack (女巫攻击)
  20. 手机上怎么做电子档文件(实用技巧)

热门文章

  1. 四.Windows I/O模型之重叠IO(overlapped)模型
  2. 转:20分钟教你使用hexo搭建github博客
  3. ASP.NET MVC 4 小项目开发总结
  4. 开发iOS即时通讯工具参考的一些开源、框架和教程
  5. 网站测试自动化系统—数据驱动测试
  6. 机器学习基石作业一中的PLA和POCKET_PLA实现
  7. Linux shell 中$() ` `,${},$[] $(()),[ ] (( )) [[ ]]作用与区别
  8. EVE-NG安装步骤
  9. 减治法在求解拓扑排序问题中的应用(JAVA)--有向无环图
  10. js中的trim()方法