java实现进制转换,还有欧几里得算法

413 阅读2分钟

今天刷题遇到的知识点,总结一下

在java里面可以用Integer来实现任意进制的转换

在java里面int 默认十进制,但是可在值前面加0,0x表示其他进制

比如: int i=0xAbc;

在Integer包装类里面,提供了进制转换的toString。

Integer.toString(int i,int j)//i=待转换的数,j代表进制

如果是16进制,键盘输入用String类型接收,然后用Integer.parseInt(String ,int k)//k表示进制

public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int t=sc.nextInt();
		System.out.println(Integer.toString(t,16));
	}

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String i=sc.next();
		int iHex=Integer.parseInt(i,16);
		System.out.println(Integer.toString(iHex,10));
	}

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
//		String n1=sc.next();
//		int iHex=Integer.parseInt(n1,16);
		String[]arr=new String[n];
		for(int i=0;i<n;i++) {
			arr[i]=sc.next();
			int iHex=Integer.parseInt(arr[i],16);
			System.out.println(Integer.toString(iHex,8));
		}
		
	}

Integer还有专门方法

10-----》2

Integer.toBinaryString(int a)//十进制转换成二进制

10--》8

Integer.toOcatalString

10---》16

Integer.HexString

其他的可以用toString。

是不是非常方便,快去试试

如何手写呢?

//使用数组的形式进行转换

  public static void trans2(int num, int radix)

  {

    System.out.println(num+"转成"+radix+"进制数为:");

 

    //创建数组,32位

    char[] arr = new char[32];

 

    //创建参考字符数组

    char[] ch = {

      '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'

    };

 

    //指针,从数组最后开始

    int pos = 32;

 

    //开始循环计算num和radix的商和余数

    while(num > 0)

    {

      arr[--pos] = ch[num % radix];

      num /= radix;

 

      /*

       * 这里是针对二进制、八进制和十六进制进行的移位运算

      arr[--pos] = ch[num&(radix-1)];

      if(radix == 2)

        num >>= 1;

      else if(radix == 8)

        num >>= 3;

      else if(radix == 16)

        num >>= 4;

      */

    }

 

    //输出有效的进制数

    for(int i = pos; i < 32; i++)

      System.out.print(arr[i]);

 

    System.out.println();

  }
//使用StringBuilder进行转换

  public static String trans3(int num, int radix)

  {

    //使用StringBuilder的reverse方法

    StringBuilder sb = **new** StringBuilder();

 

    while(num > 0)

    {

      //把除以基数的余数存到缓冲区中

      sb.append(num % radix);

      num /= radix;

    }

 

    return** sb.reverse().toString();

欧几里德算法

是用来求两个正整数最大公约数的算法。最大公约数Greatest Common Divisor,GCD,也称最大公因数Highest Common Factor,HCF、最大公因子,是一种数学概念,指两个或多个整数共有约数中最大的一个。最大公约数的求解方法有质因数分解法、短除法、辗转相除法、更相减损法等,与其相对应的概念是最小公倍数。

用编程实现:java为例子

//当知道a>b
int gcd(int a,int b){
if(b==0) return a;
else{return gcd(b,a%b);
}
}
//不知道ab关系
int gcd(int a,int b){
if(b==0) return a;
if(a==0) return b;
if(a<b) return gcd(a,b%a);
    else{return gcd(b,a%b);
}
}

也可以用来求最小公倍数

最小公倍数=(数a+b)/最大公约数

//当知道a>b
int gcd(int a,int b){
if(b==0) return a;
else{return gcd(b,a%b);
}
}


main...
int maxgcd=gcd(a,b);
int mingcd=(a+b)/maxgcd;

扩展欧几里得

当ax+by=gcd(a,b)成立,如果ax+by=m,那么m=k*gcd(a,b)

int exgcd(int a,int b,int x,int y){
if(b==0){
x=1;y=0;
return a}
int r=exgcd(b,a%b,x,y);
int temp=y;
y=x-(a/b)*y;
x=temp;
return x;