Java代码 | 计算最优地铁票价矩阵

==============票价矩阵==============
基础折扣:0.95
优惠折扣:0.6
单程票价:11.0
最低票价:2.0
====================================
刷卡:00    合计:40    金额:321.75 | ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:01    合计:41    金额:319.80 | ●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:02    合计:42    金额:317.85 | ●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:03    合计:43    金额:315.90 | ●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:04    合计:44    金额:313.95 | ●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:05    合计:45    金额:312.00 | ●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:06    合计:46    金额:310.05 | ●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:07    合计:47    金额:308.10 | ●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:08    合计:48    金额:306.15 | ●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:09    合计:49    金额:304.20 | ●●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:10    合计:50    金额:302.25 | ●●●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:11    合计:51    金额:300.30 | ●●●●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:12    合计:52    金额:298.35 | ●●●●●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:13    合计:53    金额:296.40 | ●●●●●●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:14    合计:54    金额:294.45 | ●●●●●●●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
刷卡:15    合计:55    金额:292.50 | ●●●●●●●●●●●●●●●○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
====================================
实验次数:15
最高金额:321.75    次数:0
最低金额:292.50    次数:15
消费差额:29.25
每年差额:351.00
====================================
说明:普通羊城通卡:一个自然月内,持同一张羊城通卡乘坐公交和地铁次数累计15次后,从第16次开始乘坐公交或地铁均可享受票价6折优惠,每月累计次数不跨月计算。(羊城通刷卡9.5折优惠)
package com.shenhuanjie;

import java.text.DecimalFormat;

/**
* @description: 地铁票价矩阵
* @author: SHENHUANJIE
* @create: 2019-12-17 09:11
**/
public class CalDtPrice{
    // 基础折扣
    private static double DISCOUNT = 0.95;
    // 优惠折扣
    private static double PREFERENTIAL_DISCOUNT = 0.6;
    // 单程票价
    private static double CARFARE = 11;
    // 最低票价
    private static double BASIC_CARFARE = 2;

    private static DecimalFormat decimalFormat = new DecimalFormat("#.00");

    public static void main(String[] args) {
        System.out.println("==============票价矩阵==============");
        System.out.println("基础折扣:" + DISCOUNT);
        System.out.println("优惠折扣:" + PREFERENTIAL_DISCOUNT);
        System.out.println("单程票价:" + CARFARE);
        System.out.println("最低票价:" + BASIC_CARFARE);
        System.out.println("====================================");

        // 最低消费次数
        int lowestNum = 15;
        // 最高消费
        double maxprice = 0;
        int maxNum = 0;
        // 最低消费
        double minprice = 0;
        int minNum = 0;

        for (int i = 0; i <= lowestNum; i++) {
            double totalprice = calculate(i);
            if (maxprice == 0 && minprice == 0) {
                maxprice = minprice = totalprice;
            } else {
                if (totalprice >= maxprice) {
                    maxprice = totalprice;
                    maxNum = i;
                }
                if (totalprice <= minprice) {
                    minprice = totalprice;
                    minNum = i;
                }
            }
        }
        System.out.println("====================================");
        System.out.println("实验次数:" + lowestNum);
        System.out.println("最高金额:" + decimalFormat.format(maxprice) + "\t次数:" + maxNum);
        System.out.println("最低金额:" + decimalFormat.format(minprice) + "\t次数:" + minNum);
        System.out.println("消费差额:" + decimalFormat.format(maxprice - minprice));
        System.out.println("每年差额:" + decimalFormat.format(12 * (maxprice - minprice)));
        System.out.println("====================================");
        System.out.println("说明:普通羊城通卡:一个自然月内,持同一张羊城通卡乘坐公交和地铁次数累计15次后,从第16次开始乘坐公交或地铁均可享受票价6折优惠,每月累计次数不跨月计算。(羊城通刷卡9.5折优惠)");
    }

    /**
     * 计算最低消费
     *
     * @param lowestNum 最低消费次数
     * @return 消费金额
     */
    private static double calculate(int lowestNum) {
        int priceNum = 0;
        double totalPrice = 0;
        // 通勤次数
        int totalPriceNum = 40;
        double discount = DISCOUNT;

        for (int i = 1; i <= lowestNum; i++) {
            if (priceNum >= 15) {
                discount = PREFERENTIAL_DISCOUNT;
            }
            priceNum++;
            double carfare = BASIC_CARFARE * discount;
            totalPrice += carfare;
        }

        for (int i = 1; i <= totalPriceNum; i++) {
            if (priceNum >= 15) {
                discount = PREFERENTIAL_DISCOUNT;
            }
            priceNum++;
            double carfare = CARFARE * discount;
            totalPrice += carfare;
        }
        String lnum = String.format("%02d", (lowestNum));
        String process = "";
        for (int i = 0; i < lowestNum; i++) {
            process += "●";
        }
        for (int i = 0; i < priceNum - lowestNum; i++) {
            process += "○";
        }
        System.out.println("刷卡:" + lnum + "\t合计:" + priceNum + "\t金额:" + decimalFormat.format(totalPrice) + " | " + process);

        return totalPrice;
    }
}
# Java 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×