java的递归小算法

来源:互联网 发布:血源诅咒白狼捏脸数据 编辑:程序博客网 时间:2024/05/21 12:50

4.题目描述:
有这样一个奇怪的天平,它的砝码只有1g, 3g, 9g, 27g......3k g并且各只有一个,但它却能够称出所有整数g质量的物体例如要称出质量2g,那就一边放一个3g,另一边放物体和1g的砝码就可以了。放在物体那边的砝码在前面加负号表示之。
输入:
多组测试数据,每行只有一个正整数n,表示要称的物体质量,
n32bit有符号整数所能表示的数的范围内,
最后请使用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的值.

然后,再判断item3^n的大小比较

从而确定是new_item=3^n - item  或者  new_item= item - 3^n Sn-1 <= item <= Sn),如何递归.

判断是否new_item=1234;则出口。


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);}}}


0 0