进制+异或

一.调用API 

String s=Integer.toString(十进制,转为0-35进制);

//R进制的字符串转为10进制数

int a=Integer.parseInt(s,R);

//把R进制的字符串封装成大数类

BigInteger b=new BigInteger(s,R);

二.求R进制下的数位和

2992这个数十进制和为22,十六进制为BB0和也为22,十二进制是1894和也是22

代码

public class Main {
	public static void main(String[] args) {
		System.out.println(getR(2992, 10));
		System.out.println(getR(2992, 16));
		System.out.println(getR(2992, 12));
	}
	static int getR(int num,int radix) {
		int sum=0;
		while(num>0) {
			sum+=num%radix;
			num/=radix;
		}
		return sum;
	}
}

 运行结果

三.求子集(下面用进制的方法) 

如求{1,2,3,4}的子集

0000        空集

0001        1

0010        2

0011        1,2

...

1111        1,2,3,4

所以就是要找是1的就输出,而要记录是第几个输出就用到了index,开始index是0进行一次运算就加一,再输出a[index]即可

代码

public class Main {
	public static void main(String[] args) {
		int[] a= {1,2,3,4};
		for(int i=0;i<16;i++) {
			int n=i;
			int index=0;
			while(n>0) {
				if(n%2==1) {
					System.out.print(a[index]);
				}
				index++;
				n/=2;
			}
			System.out.println();
		}
	}
}

 运行结果:

为实现更好效果

代码:

public class Main {
	public static void main(String[] args) {
		int[] a= {1,2,3,4};
		for(int i=0;i<16;i++) {
			int n=i;
			int index=0;
			System.out.print("{");
			while(n>0) {
				if(n%2==1) {
					if(n>2) {
						System.out.print(a[index]+",");
					}
					else {
						System.out.print(a[index]);
					}
				}
				index++;
				n/=2;
			}
			System.out.println("}");
		}
	}
}

运行结果:

三.经典使用异或

第一行输入i,第二行输入2*i-1个数,输出数中单独出现的

输入:

输出

 

异或相同为0不同为1 

令x=0, x^1^2^3^2^1^4^4=x^1^1^2^2^4^4^3=0^0^0^0^3=0^3=3 

即可得到单独出现的数

同理x^1^2^1=2

 代码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(sc.hasNext()) {
			int n=sc.nextInt();
			int ans=0;
			for(int i=0;i<2*n-1;i++) {
				ans=ans^sc.nextInt();
			}
			System.out.println(ans);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪八戒1.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值