java进制转换一般算法和超时解决

一般的算法,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

发布了81 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41499217/article/details/104024896