大数的M进制转换为N进制(M和N的取值范围为2~62)

很久以前遇到的一个问题,今天找了一下解决方案:https://blog.csdn.net/SJF0115/article/details/8690581
感谢sjf0115的分享。

理清楚上述博客的思想后,自己写了一遍代码,以整理思路。
具体做法其实就是求余数,然后将余数逆序拼接就是。
这里写图片描述

下面代码解释如下;
1.进制的表示用0-9 A-Z a-z
2.循环求余数。每次循环从第一位开始。
具体过程如下如:终止条件为不存在大于0的商
这里写图片描述
结合图片的过程和代码应该就很好懂了。

代码如下:

import java.util.Scanner;

/**
 * Created by zfr on 2018/08/07.
 * 只考虑正数
 * 输入:一个M进制的字符串,将其转换为N进制的字符串
 * 字符串可能很长很长 - 大数的进制转换
 *
 */
public class MtoN {
    public static void main(String[] args) {
            // TODO Auto-generated method stub
        MtoN  a = new  MtoN ();
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int m =Integer.parseInt(scanner.nextLine());
        int n =Integer.parseInt(scanner.nextLine());
        String res = a.cal(str,m,n);
        System.out.println(res);
    }
    //m进制转换为n进制
    public String cal(String str , int m ,int n){
        //输入不合法的情况,我也不知道输出什么
        //至于其他的不合法情况暂且不考虑,默认输入都是合法的
        if(str == null || str.length() == 0)
        {
            return "Error";
        }
        if( m < 2 || m > 62 || n <2 || n > 62){
            return "Error";
        }
        char[] tags = new char[62];
        for(int i= 0; i<62;i++){
            if(i >=0 && i<10){
                tags[i] = (char)('0'+i);
            }else if( i >= 10 && i<36){
                tags[i] = (char)('A'+ (i - 10));
            }else {
                tags[i] = (char)('a'+ (i - 36));
            }
        }
        StringBuilder sBuilder = new StringBuilder();

        char[] ch = str.toCharArray();
        int temp = 0;
        int div;
        int left;
        boolean flag ;
        while (true){
            left = 0;
            flag = false ;
            StringBuilder tempBuilder = new StringBuilder();
            for(int i = 0; i<ch.length;i++){
                temp = left * m + getIndex(ch[i]);
                div = temp/n;
                left = temp%n;
                if(flag){
                    tempBuilder.append(tags[div]);
                }else {
                   if(div!=0){
                       flag = true ;
                       tempBuilder.append(tags[div]);
                   }
                }
            }
            sBuilder.append(tags[left]);
            ch = tempBuilder.toString().toCharArray();
            if(flag==false)
                break;
        }
        return sBuilder.reverse().toString();
    }

    //c的取值范围是0-9 A-Z a-z
    public int getIndex(char c){
        if(c>= '0'&& c <= '9'){
            return c-'0';
        }else if(c>='A' && c<= 'Z'){
            return (c-'A')+10;
        }else {
            //c>='a' && c<= 'z'
            return (c-'a')+36;
        }
    }
}

测试结果:
1)10进制转换为16进制

1234
10
16
4D2

2)16进制转换为62进制

EFABFE
16
62
13u8s

可以验算一下:EFABFE表示的10进制为:15707134
13u8s表示的62进制为:54 + 8 *62 + 56*62^2 +3*62^3+1*62^4 = 15707134 。结果正确。

欢迎大家提出优化建议。

猜你喜欢

转载自blog.csdn.net/u012485480/article/details/81479071
今日推荐