【JAVA每日小练】找零问题

问题描述

输入一个应收金额,输入一个实收金额,显示找零的各种纸币的张数,优先考虑面额大的纸币,显示各种人民币要多少张。假如现有100、50、20、10、5、1元的面额,如果实收金额小于应收金额将报错。

分析

根据题目要求,一要优先考虑面额大的纸币,二要给出人民币的张数且得是整张数。这两个问题考虑好了,问题就迎刃而解了,具体实现方法就很简单地去完善了。朋友和另一位博主的思路具体实现如下:
朋友的思路如下:

import java.util.Scanner;

public class HelloWorld {
	public static void main(String[] args){		
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入应收金额");
		int Smoney=sc.nextInt();
		System.out.println("请输入实收金额");
		int Tmoney=sc.nextInt();
		int result=Tmoney-Smoney;
		int hundred=0,fifty=0,twenty=0,ten=0,five=0,one=0;
		if(result<0)
		{
			System.out.println("输入错误");
		}
		else {
			
			while(result!=0)
			{
				if(result>=100)
				{
					for(;result>=100;result=result-100)
					{
						hundred=hundred+1;
					}
				}
				else if(result>=50) 
				{
					for(;result>=50;result=result-50)
					{
						fifty=fifty+1;
					}
				}
					else if(result>=20)
					{
						for(;result>=20;result=result-20)
						{
							twenty=twenty+1;
						}	
					}
						else if(result>=10)
						{
							for(;result>=10;result=result-10)
							{
								ten=ten+1;
							}	
						}
							else if(result>=5)
							{
								for(;result>=5;result=result-5)
								{
									five=five+1;
								}	
							}
								else if(result>=1)
								{
									for(;result>=1;result=result-1)
									{
										one=one+1;
									}	
								}
					}System.out.println("100元"+hundred+"张"+" "+"50元"+fifty+"张"+" "+"20元"+twenty+"张"+" "+"10元"+ten+"张"+" "+"5元"+five+"张"+" "+"1元"+one+"张");
					}
		sc.close();
			}

	}

另一位博主的思路如下:

import java.util.Scanner;

public class Give_change {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input=new Scanner(System.in);
		System.out.print("请输入应收金额:");
		int a=input.nextInt();
		System.out.print("请输入实收金额:");
		int b=input.nextInt();
		if(a>b)System.out.println("实收金额小于应收金额,无法找零!");
		else if(a==b)System.out.println("实收等于应收,不用找零!");
		else{
			int m=b-a;
			int c=0,d=0,e=0,f=0,g=0,h=0; //记录不同票种张数
			if(m/100>=1)
			{
				c=m/100;
				m=m%100;
			}
			if(m/50>=1)
			{
				d=m/50;
				m=m%50;
			}
			if(m/20>=1)
			{
				e=m/20;
				m=m%20;
			}
			if(m/10>=1)
			{
				f=m/10;
				m=m%10;
			}
			if(m/5>=1)
			{
				g=m/5;
				m=m%5;
			}
			if(m/1>=1)
			{
				h=m/1;
			}
			System.out.println("找零明细:"+"100元"+c+"张  50元"+d+"张  20元"+e+"张  10元"+f+"张  5元"+g+"张  1元"+h+"张");
		}
		input.close();
	}

}

点击此处查看博主博客

结果

在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排队找零问题通常可以使用模拟的方法来解决。具体来说,我们可以使用一个计数器来统计当前队列中需要找零的总金额,以及一个变量来记录当前收银员手头上的现金总额。对于每个顾客,我们需要先判断是否可以找零,如果可以,就把找零金额加到收银员手头上的现金总额中,并且把队列中的顾客弹出。最后,如果队列为空,则找零结束,否则就继续处理下一个顾客。 具体实现如下(假设顾客的信息已经被封装成了一个Customer类): ```java import java.util.LinkedList; import java.util.Queue; public class Cashier { private int cash; // 收银员手头上的现金总额 private int total; // 需要找零的总金额 private Queue<Customer> queue; // 顾客队列 public Cashier(int cash) { this.cash = cash; this.total = 0; this.queue = new LinkedList<>(); } // 添加一个顾客到队列中 public void addCustomer(Customer c) { queue.offer(c); total += c.getPrice() - c.getMoney(); } // 处理队列中的顾客,直到队列为空 public void process() { while (!queue.isEmpty()) { Customer c = queue.peek(); if (cash >= c.getPrice() - c.getMoney()) { cash += c.getMoney(); cash -= c.getPrice() - c.getMoney(); queue.poll(); } else { break; } } } // 判断是否还有顾客需要找零 public boolean hasRemaining() { return !queue.isEmpty(); } // 获取需要找零的总金额 public int getTotal() { return total; } // 获取收银员手头上的现金总额 public int getCash() { return cash; } } ``` 使用示例: ```java Cashier cashier = new Cashier(100); // 创建一个初始现金为100的收银员 cashier.addCustomer(new Customer(50, 70)); // 添加一个需要找零20元的顾客 cashier.addCustomer(new Customer(60, 80)); // 添加一个需要找零20元的顾客 cashier.process(); // 处理顾客,此时收银员手头上的现金总额为10 System.out.println(cashier.getTotal()); // 输出剩余需要找零的总金额,为0 System.out.println(cashier.getCash()); // 输出收银员手头上的现金总额,为10 ``` 需要注意的是,排队找零问题的解决方法并不唯一,可能会因为具体情况的不同而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值