java的递归小算法
来源:互联网 发布:血源诅咒白狼捏脸数据 编辑:程序博客网 时间:2024/05/21 12:50
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);}}}
0 0
- java的递归小算法
- Java递归算法的小例子
- Java的递归算法
- Java的递归算法
- Java的递归算法
- Java的递归算法
- JAVA的递归算法
- Java的递归算法
- Java递归算法的理解
- 递归算法小例子
- 递归算法-小例子
- 递归算法小例
- 递归算法小例子
- Java递归算法的小例子 求1+2+3...+1000 和
- 算法的一些小栗子6(递归算法)
- Java递归 遍历目录的小例子
- java算法:递归算法
- 单链表逆置的递归与非递归算法 [简单的小算法练习]
- 算法-排序
- C++排序总结
- 能够同时在单片机和ANDROID下面高效运行的微GUI核心,才是好UI的基础
- DataGrid绑定数据的方式
- JAVA中的JIT
- java的递归小算法
- SSH免密码登录的方法
- 算法-二分法查找数据
- myeclipse中新导入服务器项目报错问题
- 创建Android View类
- [Linux vim问题解决] -bash: ./script.sh: /usr/bin/bash^M: bad interpreter: No such file or directory
- Mysql事物处理
- 算法-排序-选择排序
- 收集Cocos2d提供的字体