当前位置:   article > 正文

蓝桥杯Java---大数进制转换_bigdecimal十六进制转10进制

bigdecimal十六进制转10进制

        通过基本的进制转换练习后,发现基本的进制转换方法受限于int的大小限制,对于很多大数进制转换无能为力。在学习过程中发现BigDecimal可以很好地应对大数进制转换。

1.BigDecimal涉及到的知识点

add(BigDecimal)BigDecimal对象中的值相加,然后返回这个对象。
multiply(BigDecimal)BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal)BigDecimal对象中的值相除,然后返回这个对象。
pow(int n)

返回一个BigDecimal,其值是 (thisn), 被精确计算的幂值,使其具有无限精度。

(参数n必须在范围0到999999999)

divideAndRemainder(BigDecimal)返回一个BigDecimal[ ]数组,第一个数是商,第二个数是余数。
compareTo(BigDecimal)

前比后,比较结果:

==  1                    前比后大

==  0                    前后相等

== -1                    前比后小

2.解题思路

1.首先输入判断

        利用正则表达式判断是否满足十六进制要求。

  1. String regex="[0-9A-F]+";
  2. str.matches(regex)

2.将字符串拆解成为单个字符

char[] ch=str.toCharArray();

3.将单个字符转换成十进制

int x1=Integer.parseInt(String.valueOf(ch[i]),16);

 4.按位计算

        进制的每一位对应着他本身乘以进制的次方。

BigDecimal x2=new BigDecimal(16).pow(ch.length-i-1).multiply(BigDecimal.valueOf(x1));

5.计算总和

num=num.add(x2);

6.循环判断除8,商覆盖num,余数记录。

  1. while(true){
  2. if(num.compareTo(BigDecimal.valueOf(8)) > 0){
  3. BigDecimal[] results = num.divideAndRemainder(BigDecimal.valueOf(8));
  4. num=results[0];
  5. sb.append(results[1]);
  6. }else {
  7. sb.append(num);
  8. break;
  9. }
  10. }

3.完整代码

  1. import java.math.BigDecimal;
  2. import java.util.Scanner;
  3. public class Demo4 {
  4. public static void main(String[] args) {
  5. /*
  6. *给定n个十六进制正整数,输出它们对应的八进制数。
  7. */
  8. // String str="123AE";
  9. Scanner sc=new Scanner(System.in);
  10. String regex="[0-9A-F]+";
  11. int n=sc.nextInt();
  12. if(n>=1&&n<=10){
  13. String[] strAll=new String[n];
  14. for(int j=0;j<n;j++){
  15. strAll[j]=sc.next();
  16. }
  17. for(int j=0;j<n;j++){
  18. String str=strAll[j];
  19. if(str.matches(regex)&&str.length()<100000){
  20. BigDecimal num=new BigDecimal(0);
  21. char[] ch=str.toCharArray();
  22. for(int i=ch.length-1;i>=0;i--){
  23. //单个字符转十进制
  24. int x1=Integer.parseInt(String.valueOf(ch[i]),16);
  25. //按位计算
  26. BigDecimal x2=new BigDecimal(16).pow(ch.length-i-1).multiply(BigDecimal.valueOf(x1));
  27. num=num.add(x2);
  28. }
  29. StringBuffer sb=new StringBuffer();
  30. while(true){
  31. if(num.compareTo(BigDecimal.valueOf(8)) > 0){
  32. BigDecimal[] results = num.divideAndRemainder(BigDecimal.valueOf(8));
  33. num=results[0];
  34. sb.append(results[1]);
  35. }else {
  36. sb.append(num);
  37. break;
  38. }
  39. }
  40. System.out.println(sb.reverse().toString());
  41. }
  42. }
  43. }
  44. }
  45. }

缺点:虽然内存用比上一次小了很多,但是时间还是不达标。


补充:BigInteger

        构造方法中可以实现进制转换,并且一行代码即可解决进制转换问题。下面是先转十进制,再转8进制。

String x=new BigInteger(str,16).toString(8);

总代码如下:

  1. import java.math.BigInteger;
  2. import java.util.Scanner;
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner sc=new Scanner(System.in);
  6. String regex="[0-9A-F]+";
  7. int n=sc.nextInt();
  8. if(n>=1&&n<=10){
  9. String[] strAll=new String[n];
  10. for(int j=0;j<n;j++){
  11. strAll[j]=sc.next();
  12. }
  13. for(int j=0;j<n;j++){
  14. String str=strAll[j];
  15. if(str.matches(regex)&&str.length()<100000){
  16. String x=new BigInteger(str,16).toString(8);
  17. System.out.println(x);
  18. }
  19. }
  20. }
  21. }
  22. }

但是:

原因未知,自己测试正确。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/226730
推荐阅读
相关标签
  

闽ICP备14008679号