零钱通项目之分开实现

这是一个Java实现的零钱通系统,提供菜单交互,包括查看零钱通明细、收益入账和消费记录。用户可以输入金额和消费说明,系统会实时更新余额,并详细记录每一笔操作的时间和详情。系统支持退出功能,确保用户能够便捷地管理个人财务。
摘要由CSDN通过智能技术生成

化繁为简

  • 先完成显示菜单并可以选择
  • 完成零钱通明细
  • 完成收益入账
  • 消费
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class SmallChangeSys {
    //化繁为简
    //1.先完成显示菜单并可以选择,给出对应提示信息
    //2.完成零钱通明细
    //3.完成收益入账
    //4.消费
    public static void main(String[] args) {
        //定义相关变量
        boolean loop = true;
        Scanner scanner = new Scanner(System.in);
        String key = "";

        //2.完成零钱通明细
        //思路分析:(1)把收益入账和消费,保存到数组(2)使用对象(3)简单的使用String拼接
        String details = "===========零钱通明细===========";

        //3.完成收益入账
        //思路分析:定义新的变量
        double money = 0;
        double balance = 0;
        Date date = null;//Date表示日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//用于日期格式化

        //4.消费
        //定义新变量:保存消费原因
        String note = "";
        do{
            System.out.println("\n===========零钱通菜单===========");
            System.out.println("\t\t\t1 零钱通明细");
            System.out.println("\t\t\t2 收益入账");
            System.out.println("\t\t\t3 消费");
            System.out.println("\t\t\t4 退出");

            System.out.print("请选择(1-4):");
            key = scanner.next();

            //使用switch分支控制
            switch (key) {
                case "1" :
                    System.out.println(details);
                    break;
                case "2" :
                    System.out.print("收益入账金额:");
                    money = scanner.nextDouble();
                    //money值校验
                    balance += money;
                    //拼接收益入账信息到details
                    date = new Date();//获取当前日期
                    details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
                    break;
                case "3" :
                    System.out.print("消费金额:");
                    money = scanner.nextDouble();
                    //money值校验
                    System.out.print("消费说明:");
                    note = scanner.next();
                    balance -= money;
                    //拼接消费信息到details
                    date = new Date();//获取当前日期
                    details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
                    break;
                case "4" :
                    System.out.println("4 退出");
                    loop = false;
                    break;
                default:
                    System.out.println("菜单选择有误,请重新选择");
            }
        }while(loop);

        System.out.println("==========退出零钱通系统==========");
    }
}

实现界面:
在这里插入图片描述

零钱找零问题是一个经典的动态规划问题,也可以使用贪心算法来解决。下面给出两种解法的代码实现。 1. 动态规划解法: ```objc #import <Foundation/Foundation.h> NSInteger minCoins(NSArray<NSNumber *> *coins, NSInteger amount) { NSMutableArray<NSNumber *> *dp = [NSMutableArray arrayWithCapacity:amount + 1]; for (NSInteger i = 0; i <= amount; i++) { dp[i] = @(amount + 1); } dp[0] = @0; for (NSInteger i = 1; i <= amount; i++) { for (NSNumber *coin in coins) { if (i >= coin.integerValue) { dp[i] = @(MIN(dp[i].integerValue, dp[i - coin.integerValue].integerValue + 1)); } } } return dp[amount].integerValue > amount ? -1 : dp[amount].integerValue; } int main(int argc, const char * argv[]) { @autoreleasepool { NSArray<NSNumber *> *coins = @[@1, @2, @5]; NSInteger amount = 11; NSInteger result = minCoins(coins, amount); NSLog(@"The fewest number of coins needed to make change for %ld is: %ld", amount, result); } return 0; } ``` 在上述代码中,我们定义了一个名为 `minCoins` 的函数来计算零钱找零问题的最少硬币数量。使用动态规划的思想,我们创建了一个数组 `dp`,其中 `dp[i]` 表示凑够金额 `i` 的最少硬币数量。过迭代计算每个金额的最少硬币数量,最终得到凑够金额 `amount` 的最少硬币数量。 在 `main` 函数中,我们设定了硬币面额数组 `coins` 为 `[1, 2, 5]`,目标金额 `amount` 为 `11`,并调用 `minCoins` 函数来计算最少硬币数量。最后,使用 `NSLog` 打印出结果。 编译运行上述代码,将会输出:The fewest number of coins needed to make change for 11 is: 3,表示凑够金额 `11` 需要的最少硬币数量为 `3`。 2. 贪心算法解法: ```objc #import <Foundation/Foundation.h> NSInteger minCoins(NSArray<NSNumber *> *coins, NSInteger amount) { NSInteger count = 0; for (NSInteger i = coins.count - 1; i >= 0 && amount > 0; i--) { if (coins[i].integerValue <= amount) { NSInteger num = amount / coins[i].integerValue; count += num; amount -= num * coins[i].integerValue; } } return amount == 0 ? count : -1; } int main(int argc, const char * argv[]) { @autoreleasepool { NSArray<NSNumber *> *coins = @[@1, @2, @5]; NSInteger amount = 11; NSInteger result = minCoins(coins, amount); NSLog(@"The fewest number of coins needed to make change for %ld is: %ld", amount, result); } return 0; } ``` 在上述代码中,我们同样定义了一个名为 `minCoins` 的函数来计算零钱找零问题的最少硬币数量。使用贪心算法的思想,我们从最大面额的硬币开始,尽可能多地使用该面额的硬币,然后逐步减小面额直到凑够目标金额。 在 `main` 函数中,我们同样设定了硬币面额数组 `coins` 为 `[1, 2, 5]`,目标金额 `amount` 为 `11`,并调用 `minCoins` 函数来计算最少硬币数量。最后,使用 `NSLog` 打印出结果。 编译运行上述代码,将会输出:The fewest number of coins needed to make change for 11 is: 3,表示凑够金额 `11` 需要的最少硬币数量为 `3`。 希望以上示例代码对你有所帮助。如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值