开发一个递归方法,确定将一定数量的钱(以分为单位)转换成两角五分的硬币,一角硬币,五分和一分硬币的方法总数。例如,假设总钱数为17分,那么共有6种方法。
1角,7分
1角,1五分,2一分
3五分,2一分
2五分,7一分
1五分,12一分
17一分最好给出源代码,或者给些提示也好,谢谢。
1角,7分
1角,1五分,2一分
3五分,2一分
2五分,7一分
1五分,12一分
17一分最好给出源代码,或者给些提示也好,谢谢。
解决方案 »
- 客户端上传图片的问题(50分)
- Swing 使用LookAndFeel 后中文乱码。请哪个大哥帮帮忙
- 关于inputStream的read(byte [])
- 如何用java来区分是空格还是tab键
- 对于如下的代码,如何写单体测试代码?
- 请教高手(超大整数)
- 急!关于文件路径的问题,在线等
- 求帮忙建类。。
- 求高手点拨:怎样修改一个Swing的“不支持中文”的皮肤为“能够支持中文”的功能.
- VISUAL C#.NET与JAVA倒底哪个能成为主流?大家进来讨论?
- 急,请问如何解决:Exception in thread "main"java.lang.NoClassDefFoundError: org/eclipse/jface/viewers/ISelectionChangedListener
- 如何用java调用默认邮件客户端发送邮件(邮件是带附件的)?
package test;import java.util.Stack;class Money { int fen;
int number;
}public class Temp {
static Stack<Money> stack = new Stack<Money>();
static int[] nums = new int[] { 10, 5, 2, 1 }; public static void fen(int target, int sum, int index) {
for (int i = index; i < nums.length; i++) {
int num = nums[i];
Money m = new Money();
m.fen = num;
stack.push(m);
while (sum + num <= target) {
m.number++;
if (sum + num == target) {
showResult();
}
sum += num;
}
fen(target, sum, i + 1);
stack.pop();
sum -= m.fen * m.number;
}
} private static void showResult() {
for (Money m : stack) {
if (m.number > 0) {
System.out.print(m.fen + ":" + m.number + " ");
}
}
System.out.println();
} public static void main(String[] input) throws Exception {
fen(17, 0, 0);
}
}我的答案比你猜测的多
10:1 5:1 2:1
10:1 5:1 1:2
10:1 2:3 1:1
10:1 1:7
5:3 2:1
5:3 1:2
2:8 1:1
1:17
static int[] nums = new int[] { 25, 10, 5, 1 };
后
结果为:
10:1 5:1 1:2
10:1 1:7
5:3 1:2
1:17
10:1 5:1 1:2
10:1 1:7
5:3 1:2
1:17
是重复的
不知道为什么啊
您再看看?
package test;import java.util.Stack;class Money { int fen;
int number;
}public class Fen {
static Stack<Money> stack = new Stack<Money>();
static int[] nums = new int[] { 25, 10, 5, 1 }; public static void fen(int target, int sum, int index) {
Money m = null;
for (int i = index; i < nums.length; i++) {
int num = nums[i];
if (num > target) { // 这里判断一下就可以了
continue;
}
m = new Money();
m.fen = num;
stack.push(m);
while (sum + num <= target) {
m.number++;
if (sum + num == target) {
showResult();
}
sum += num;
}
fen(target, sum, i + 1);
stack.pop();
sum -= m.fen * m.number;
}
} private static void showResult() {
for (Money m : stack) {
if (m.number > 0) {
System.out.print(m.fen + ":" + m.number + " ");
}
}
System.out.println();
} public static void main(String[] input) throws Exception {
fen(17, 0, 0);
}
}
那本中文的Standard ML书上有个简约算法
行就是Java的1/10
还保证正确
还保证通用
/*这是个输入多少美分,然后递归统计出换成一角五分 一分硬币的种数
* */
import java.util.Scanner;public class ChangeMoney {
public static void main(String [] args){
Scanner input = new Scanner(System.in) ;
long yourmoney ;
long Zhongshu = 0 ;
System.out.println("输入你有多少money:");
yourmoney = input.nextLong() ;
Zhongshu = chang(yourmoney) ;
System.out.println(Zhongshu);
}
public static long chang(long money){
long part1 = 0 ;
long part2 = 0 ;
if (money < 25) {
return GetPart2(money);
}else {
part2 = GetPart2(money);
return chang(money - 25)+part2 ;
}
}
public static long GetPart2(long money)
{
long count = 0;
for (int i = (int)money/10; i >=0; i--) {
for (int j = (int )money /5 ; j >=0; j--) {
for (int j2 = (int)money; j2 >=0; j2--) {
if (10 * i+5*j+j2==money) {
count++ ;
}
}
}
}
return count ;
}
}