很久以前遇到的一个问题,今天找了一下解决方案: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 。结果正确。
欢迎大家提出优化建议。