参考网址:http://blog.csdn.net/famousdt/article/details/7416264
http://blog.csdn.net/clxjoseph/article/details/7994089
以下代码为宿舍龙哥所写,版权归龙哥所有!
平衡三进制具体转化方法
先转化为用0,1,2表示的3进制,然后通过“借位”转换
若对应的系数为2,则变为-1,下一位+1
若对应的系数为3,则变为0,下一位+1
为0或1时不变
原理即是如果第i位为1,可以用砝码抵消,如果是2的话没法抵消,只能把第i位变为-1,第i+1位加1来抵消。
import java.util.Scanner;
/**
* 给你组数字,1,3,9,27,81<br>
* 你输入一个121以内的数<br>
* 只用加减,大的数字在前面<br>
* 输出一个式子<br>
* 比如,你输入5,输出:9-3-1=5<br>
* 或者,你输入7,输出:9-3+1=7<br>
*/
/*
* 给你一个天平,和一些砝码,只是这些砝码有点特殊,它的重量是1,3,9,27,……,3^n。
* 让你把一些砝码和一个给定的重量的物体放在左边,另一些砝码放在右边,使天平平衡
* (每个砝码最多用一个),你会怎么做呢?这是一个很有趣的事,不是吗?
* 这就是用平衡三进制解决最好的一个例子:
*
* 比如我们假设这个物体的重量是20,那么我们可以这样做。首先我们把20(十进制)转化为
* 三进制(202),然后我们按照一定的规则,把这些数转化成0,1,-1表示。
*
* 从低位到高位,我们这样来转化。
* 当我们遇到一个2的时候,那么下一位加1,同时2变成-1。当我们遇到
* 3的时候,那么下一位加1,同时3变成0,。然而当我们遇到1或0的时候我们不变也不进位。
* 所以202就变成了1(-1)1(-1),这样20=(-1)*3^0+1*3^1+(-1)*3^2+1*3^3;
* 这是一个很好的等式,所以我们把-1的项移到左边,剩下的在右边,就变成了20+1*3^0+1*3^2=1*3^1+1*3^3;
* 这样放在天平的两端不就平衡了吗?20+1+9=3+27;
* over……
*/
public class TripleMagic {
public static void main(String[] args) {
System.out.println(TripleMagic.convert2Triple(200));
// System.out.println(23 & 3);
System.out.println(TripleMagic.add(19, 11));
System.out.println(Integer.toBinaryString(23));
System.out.println(TripleMagic.toUnsignedString(23, 1));
System.out.println(Integer.toHexString(23));
System.out.println(TripleMagic.toUnsignedString(23, 4));
System.out.println(Integer.toOctalString(23));
System.out.println(TripleMagic.toUnsignedString(23, 3));
Scanner input = new Scanner(System.in);
int a = input.nextInt();
if (a >= 1 && a <= 121) {
int[] triple = convert2BalanceTriple(a);
StringBuilder str = new StringBuilder();
for (int i = triple.length - 1; i >= 0; i--) {
if (triple[i] == 1) {
str.append("+");
str.append((int) Math.pow(3, i));
}
if (triple[i] == -1) {
str.append("-");
str.append((int) Math.pow(3, i));
}
}
if (str.charAt(0) - '0' < 0) {
System.out.println(str.substring(1, str.length()));
} else {
System.out.println(str.toString());
}
}
input.close();
}
/**
* 不用加减乘除做加法<br>
* <li>第一步只做各位相加不进位
* <li>第二步做进位
* <li>第三步把前面两个结果加起来
*
* @param num1
* @param num2
* @return
*/
public static int add(int num1, int num2) {
int sum, carry;
do {
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
} while (num2 != 0);
return num1;
}
/**
* 十进制转换为三进制
* A Mod B = A-(A div B) * B (div含义为整除);
* @param a
* @return
*/
public static String convert2Triple(int a) {
char[] buf = new char[32];
int charPos = 32;
while (a > 0) {
buf[--charPos] = digits[a % 3];
a = a / 3;
}
return new String(buf, charPos, (32 - charPos));
}
/**
* 十进制转换为平衡三进制
* @param a
* @return
*/
public static int[] convert2BalanceTriple(int a) {
int lower = 0;
int carry = 0;
int[] result = new int[5];
int index = 0;
while (a > 0) {
switch (a % 3) {
case 0:
lower = 0 + carry;
carry = 0;
break;
case 1:
lower = 1 + carry;
carry = 0;
break;
case 2:
lower = -1 + carry;
carry = 1;
break;
}
if (lower == 2) {
lower = -1;
carry++;
}
result[index++] = lower;
a = a / 3;
}
if (carry == 1) {
result[index] = carry;
}
return result;
}
/**
* Convert the integer to an unsigned number.
*/
public static String toUnsignedString(int i, int shift) {
char[] buf = new char[32];
int charPos = 32;
int radix = 1 << shift;
int mask = radix - 1;
do {
buf[--charPos] = digits[i & mask];
i >>>= shift;
} while (i != 0);
return new String(buf, charPos, (32 - charPos));
}
/**
* All possible chars for representing a number as a String
*/
final static char[] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};
}