java-每位顾客付款后给出找零钱的最佳组合

  假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50(N50)10(N10) 5(N5)1(N1) 四种。

  下面为程序的代码:

/************************************************************   
Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.   
FileName: test.cpp 
  
Author:  Light      
Version : 1.0     
Date:   2018/4/17
Description:     
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,
现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。
假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种
 // 模块描述         
Version: 
 仅用于软件测试,完成作业
// 版本信息 
  
Function List: // 主要函数及其功能     
1.
 History: 
  // 历史修改记录 
      
	<author>  <time>   <version >   <desc>       
     Light    18/4/17     1.0        建立函数 

***********************************************************/
package demo;

import java.util.Scanner;

public class main {

	/**
	 * 主函数
	 * @param args
	 */
	public static void main (String[] args) {
		// TODO Auto-generated method stub
		
		int pay = 0;//付款金额
		int cost = 0;//商品花费
		int change = 0;//找钱
		
		@SuppressWarnings("resource")
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入顾客付款金额:");
		//对输入的内容进行检测,是否符合规则
		try
		{
			pay = scanner.nextInt();
			if (pay > 100 || pay < 0)
			{
				System.out.println("请输入正确的金额");
				return;
			}
			
		}catch (Exception e)
		{
			System.out.println("请输入合法数字");
			return;
		}
		
		
		System.out.println("请输入商店货品价格:");
		//对输入的内容进行检测,是否符合规则
		try
		{
			cost = scanner.nextInt();
			if (cost > 100 || cost < 0)
			{
				System.out.println("请输入正确的金额");
				return;
			}
			else if (cost > pay)
			{
				System.out.println("您的消费金额超出支付金额");
				return;
			}
		}catch (Exception e)
		{
			System.out.println("请输入合法数字");
			return;
		}
		
		change = pay-cost;
		
		//输出此时的付款金额,商品价格,应找金额
		System.out.println("付款金额" + pay +"   货品价格" + cost + "     应找总金额:" + change);
		
		//获得结果,进行输出
		String end = giveChange(change);
		System.out.println("此次消费应找金额  " + change + " 元,其中应找  " + end);
		
	}
	
	/**
	 * 以找钱规则找钱
	 * @param change
	 * @return String//返回最终的找钱结果
	 */
	public static String giveChange(int change)
	{
		String str="";
		int qianshu;//应该找钱的张数
		int leftmoney = change;//还剩下多少钱,初始值为change
		
		if (leftmoney / 50 != 0)
		{
			qianshu = leftmoney / 50;
			str = str + qianshu + "张50元 ";
			leftmoney = leftmoney - qianshu * 50;
		}
		if (leftmoney / 10 != 0)
		{
			qianshu = leftmoney / 10;
			str = str + qianshu + "张10元 ";
			leftmoney = leftmoney - qianshu * 10;
		}
		if (leftmoney / 5 != 0)
		{
			qianshu = leftmoney / 5;
			str = str + qianshu + "张5元 ";
			leftmoney = leftmoney - qianshu * 5;
		}
		if (leftmoney / 1 != 0)
		{
			qianshu = leftmoney / 1;
			str = str + qianshu + "张1元 ";
			leftmoney = leftmoney - qianshu * 1;
		}
		
		//检验是否完全找完
		System.out.println("剩余没有找完的钱数为:"+leftmoney);
		return str;
	}
}

  

转载于:https://www.cnblogs.com/suifengye/p/8868345.html

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
元、1元。请问如何设计一个程序来实现这个功能? 首先,我们可以将所有的货币面值存入一个数组中,例如: ``` int[] coins = {50, 20, 10, 5, 2, 1}; ``` 然后,对于每一个顾客付款金额,我们可以通过以下的贪心算法来计算最少的找零钱张数: 1. 初始化一个空的记录找零钱张数的数组 change。 2. 对于每一个货币面值 coin,循环执行以下步骤: 1. 计算当前面值 coin 可以找零的最大张数:maxCount = payment / coin。 2. 将 change 数组中对应面值 coin 的数量设为 maxCount。 3. 更新 payment 的值为 payment - maxCount * coin。 4. 如果 payment 的值已经为 0,说明已经找零完毕,退出循环。 3. 统计 change 数组中所有面值的数量之和,即为找零钱的最少张数。 下面是具体的 Java 代码实现: ``` public static int[] getChange(int payment) { int[] coins = {50, 20, 10, 5, 2, 1}; int[] change = new int[coins.length]; for (int i = 0; i < coins.length && payment > 0; i++) { int maxCount = payment / coins[i]; change[i] = maxCount; payment -= maxCount * coins[i]; } return change; } public static int getMinChangeCount(int payment) { int[] change = getChange(payment); int count = 0; for (int i = 0; i < change.length; i++) { count += change[i]; } return count; } ``` 可以通过调用 `getChange` 方法来获取找零钱组合,通过调用 `getMinChangeCount` 方法来获取最少的找零钱张数。例如: ``` int payment = 87; int[] change = getChange(payment); int count = getMinChangeCount(payment); System.out.println("Payment: " + payment); System.out.println("Change: " + Arrays.toString(change)); System.out.println("Min change count: " + count); ``` 出结果为: ``` Payment: 87 Change: [1, 1, 1, 0, 1, 0] Min change count: 4 ``` 其中,change 数组表示找零钱组合为 50 元1张、20 元1张、10 元1张、5 元0张、2 元1张、1 元0张;最少的找零钱张数为 4 张。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值