一般的算法,10进制转换成r进制
方法:除基求余 直到商为零 余数反转
import java.util.*;
import java.math.*;
public class Main {
static final String scale = "0123456789ABCDEFGHIJ";
//n进制表示的位数,例如二进制只有0 1表示,八进制用0-7来表示,十六进制用0-9 A-F来表示
public static void transform(int n, int base) {
if(n!=0) {
int q = n/base;
int r = n%base;
//处理当基数是负数时得到负余数
//
while(r<0) {
q++;
r = n-q*base;
}
transform(q,base);
System.out.print(scale.charAt(r));
//其实是倒序输出的余数,因为一层层递归,从商为零的地方开始输出余数
}
}
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int base = input.nextInt();
System.out.print(n+"=");
if(n==0 || base==0) {
System.out.println(0);
}else {
transform(n,base);
}
System.out.println("(base"+base+")");
}
}
对于输入的样例过大时会超时
十六进制转换成八进制,是以十进制为中间转换,不能直接转换成八进制,解决运行超时,可以转换成二进制一个字符进行转换
package lqtest;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++){
String str=sc.next();
StringBuilder sb=new StringBuilder();
for(int j=0;j<str.length();j++){
String str1=Integer.toBinaryString(Integer.valueOf(String.valueOf(str.charAt(j)),16));
//十六进制转换成二进制
/**
* str1是一个二进制数
* Integer.valueOf(String.valueOf(str.charAt(j)),16)
* 16-->10-->2
* 输入的是十六进制数,进行每一位的处理
* str.charAt(j) str 的第j个字符 返回值类型是char,要转换成String
* 将
*/
for(int m=str1.length();m<4;m++){
str1="0"+str1;
}
/**
* 二进制少于4位补零
*/
sb=sb.append(str1);//二进制字符串
/**
* 将二进制数字拼接
*/
}
/**
* 现在得到的sb是16进制对应的二进制
* 将将二进制处理成八进制,同样也是一位一位的进行处理
* 八进制是三位一组
* 第一步,补零,补成3的倍数、长度对三取余,然后被三减,得到需要补的位数
* 补零加载前面
*/
int zeros=3-sb.length()%3;
for(int m=0;m<zeros;m++){//为八进制做准备补零
sb=new StringBuilder("0").append(sb);
}
StringBuilder str3=new StringBuilder();
String o=new String();
for(int m=0;m<sb.length();m+=3){
String str2=sb.substring(m,m+3);//字符串切割
o=Integer.toOctalString(Integer.valueOf(String.valueOf(str2), 2));
str3=str3.append(o);
}
/**
* 2-->10-->8
* str3是一个八进制
* 八进制开头不为零
* 将开头为零替换成空replaceAll("^0+", "");以零开头且大于一次
* ^以什么开头 +大于零次
*/
String str4=str3.toString().replaceAll("^0+", "");
System.out.println(str4);
}
sc.close();
}
}
参考博客:
https://blog.csdn.net/CR_fun/article/details/79297067
https://blog.csdn.net/xiaozhuo_tang/article/details/57085346