4.题目描述:
有这样一个奇怪的天平,它的砝码只有1g, 3g, 9g, 27g......3k g并且各只有一个,但它却能够称出所有整数g质量的物体例如要称出质量2g,那就一边放一个3g,另一边放物体和1g的砝码就可以了。放在物体那边的砝码在前面加负号表示之。
输入:
多组测试数据,每行只有一个正整数n,表示要称的物体质量,
n在32bit有符号整数所能表示的数的范围内,
最后请使用EOF结束本程序
输出:
怎么称质量n出来
样例输入:
2
3
4
样例输出:
2 = 3 - 1
3 = 3
4 = 3 + 1
算法思路:
首先,输入的数字是item,封装一個方法为等比数列求和.
An=3^(n-1)
Sn=(3^n - 1)/2;
首先判断,item在相邻Sn的哪个范围,从而确定n的值.
然后,再判断item与3^n的大小比较来
从而确定是new_item=3^n - item 或者 new_item= item - 3^n (Sn-1 <= item <= Sn),如何递归.
判断是否new_item=1、2、3、4;则出口。
import java.util.Scanner;
public class Weigh {
// 计算是最大用的是的3的n次方的n是多少.
public static int judge_n(long item) {
int n = 1;
while ((long) (Math.pow(3, n) - 1) / 2 < item) {
n++;
}
return n - 1;
}
//递归来算出str的值.
public static String printf_result(int n, long i) {
String str1 = "1";
String str2 = "3-1";
String str3 = "3";
String str4 = "3+1";
//i=1、2、3、4分别是程序的出口.
if (i == 1) {
return str1;
} else if (i == 2) {
return str2;
} else if (i == 3) {
return str3;
} else if (i == 4) {
return str4;
} else {//当3^n<item的时候,自然是item=3^n + x.故中间的连接符为"+".后面的字符串就是递归下一位的.
if (Math.pow(3, n) < i) {
String str = (long)Math.pow(3, n) + "+" + printf_result(judge_n(new_item(n,i)),new_item(n,i));
return str;
} else if (Math.pow(3, n) == i) {//3^n=item,直接得到结果.可以打印输出.
return Long.toString((long) Math.pow(3, n));
} else {//当3^n<itme,item=3^n-x.故中间的连接符为"-",后面的字符串先递归到下一位再调用转换符号的方法.
String str = (long)Math.pow(3, n) + "-" + change_symbol(printf_result(judge_n(new_item(n,i)),new_item(n,i)));
return str;
}
}
}
//计算下一个递归所需的值
public static long new_item(int n,long item) {
if(Math.pow(3, n) > item) {
return (long)Math.pow(3,n) - item;
}else{
return item - (long)Math.pow(3,n);
}
}
//改变字符串的符号.
public static String change_symbol(String str1) {
char[] stringArr = str1.toCharArray();
for (int i = 0; i < stringArr.length; i++) {
if (stringArr[i] == '+') {
stringArr[i] = '-';
} else if (stringArr[i] == '-') {
stringArr[i] = '+';
}
}
return new String(stringArr);
}
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
System.out.println("please intput the weigh what do you want to weigh:");
long i = input.nextLong();
//做简单错误的判断.
if (i < 1) {
System.out.println("输入有误,请输入大于1g的所需称重物体.");
} else {
int n = judge_n(i);
System.out.print(i + "=");
String str = printf_result(n, i);
System.out.println(str);
}
}
}