算法------编程珠玑(ProgrammingPeals)第三章习题(JAVA)

package code_03_chapter;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 *Created by William on 2018/6/18 0018
 */
public class QuestionsInChapter3 {
    /**
     * Q1:
     * 本书行将出版之时,美国的个人所得税分为5种不同的费率,其中最大的费率大约为40%。
     * 以前的情况更为复杂,税率也更高。下面所示的程序文本采用25个if语句的合理方式来计算1978年的美国联邦所得税。
     * 税率分别为0.14,0.15,0.16, 0.17, 0.18,·····。此后的费率增幅大于0.01.有何建议?
     * 两种解法,Q1_1和Q1_2
     * Q1_1是硬代码,很难看懂
     * 推荐Q1_2,效率也高
     */
    public static class Q1_1 {
        public static double taxPay(double salary) {
            double tax = 0;
            double tempI;
            double tempJ;
            int round = 0;
            DecimalFormat df = new java.text.DecimalFormat("#.00");
            for (double i = 0.14; i < 0.41; i += 0.01) {
                tempI = Double.parseDouble(df.format(i));
                for (double j = 2200; j < 2200 + 13500; j += 500) {
                    int temp = (int) ((j - 2200) / 500) + 1;
                    tempJ = Double.parseDouble(df.format(temp * 0.01 + 0.13));
                    if (salary >= j && tempI == tempJ && salary - 2200 > 0) {
                        double taxPayNumber = salary - 2200 - 500 * round;
                        if (taxPayNumber >= 500) taxPayNumber = 500;
                        tax += taxPayNumber * tempI;
                    }
                }
                round++;
            }
            return Double.parseDouble(df.format(tax));
        }

        public static void main(String[] args) {
            System.out.println(taxPay(2200));
            System.out.println(taxPay(2700));
            System.out.println(taxPay(3200));
            System.out.println(taxPay(3700));
        }
    }

    public static class Q1_2 {
        static class Tax {
            double rate;  //税收率下界
            double base;  //基本税收
            double bound; //税收下界
        }

        Tax[] taxTable = new Tax[1000];

        public void createTable(int n) {
            for (int i = 0; i < n; i++) {
                taxTable[i] = new Tax();
            }
            taxTable[0].rate = 0;
            taxTable[0].bound = 0;
            taxTable[0].base = 0;
            taxTable[1].rate = 0.14;
            taxTable[1].bound = 2200;
            taxTable[1].base = 0;
            for (int i = 2; i < n; i++) {
                taxTable[i].bound = taxTable[i - 1].bound + 500;
                taxTable[i].rate = taxTable[i - 1].rate + 0.01;
                taxTable[i].base = taxTable[i - 1].base + taxTable[i - 1].rate * 500;
            }
        }

        public double calculateTax(double salary) {
            int index = (int) ((salary - 2200 + 500 - 1) / 500);
            return taxTable[index].base + taxTable[index].rate * (salary - taxTable[index].bound);
        }

        public static void main(String[] args) {
            Q1_2 q1_2 = new Q1_2();
            q1_2.createTable(25);
            System.out.println(q1_2.calculateTax(2500));
        }
    }

    /**
     * Q3:
     * 编写一个“banner”函数,该函数的输入为大写字母,输出为一个字符数组,该数组以图形化的方式表示该字母。
     * 感觉挺无聊,Q2,Q3不做了
     */

    /**
     * Q4:
     * 1.编写处理如下日期的函数:给定两个日期,计算两者之间的天数;
     * 2.给定一个日期,返回值为周几;
     * 给定月和年,使用字符数组生成该月的日历。
     * 这个题用java实在简单
     */
    public static class Q4 {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        public int dayCount(String date1, String date2) throws ParseException {
            Date parse1 = dateFormat.parse(date1);
            Date parse2 = dateFormat.parse(date2);
            long l = Math.abs(parse1.getTime() - parse2.getTime());
            return (int) (l / 86400000);
        }

        public void dateFormat(String date) throws ParseException {
            Date date1 = dateFormat.parse(date + "是:");
            System.out.println(date);
            dateFormat.applyPattern("D");
            System.out.println("一年中的第几天:" + dateFormat.format(date1));
            dateFormat.applyPattern("d");
            System.out.println("一个月中的第几天:" + dateFormat.format(date1));
            dateFormat.applyPattern("w");
            System.out.println("一年中的第几周:" + dateFormat.format(date1));
            dateFormat.applyPattern("W");
            System.out.println("一个月中的第几周:" + dateFormat.format(date1));
            dateFormat.applyPattern("E");
            System.out.println("一个星期中的天数:" + dateFormat.format(date1));

        }

        public static void main(String[] args) throws ParseException {
            Q4 q4 = new Q4();
            System.out.println(q4.dayCount("2018-02-11", "2018-02-15"));
            q4.dateFormat("2018-02-11");
        }
    }

    /**
     * Q5:将输入的单词表示成带有后缀连字符的单词
     */
    public static class Q5 {
        static String[] table = {"et-ic", "al-is-tic", "s-tic", "p-tic", "-lyt-ic", "ot-ic", "an-tic",
                "n-tic", "c-tic", "at-ic", "h-nic", "n-ic", "m-ic", "l-lic", "b-lic", "-clic", "l-ic",
                "h-ic", "f-ic", "d-ic", "-bic", "a-ic", "-mac", "i-ac"};
        public static void wordMatch(String inputWord) {
            String[] newTable = new String[table.length];
            for (int i = 0; i < table.length; i++) {
                newTable[i] = table[i].replace("-", "");
            }
            for (int i = 0; i < newTable.length; i++) {
                if (inputWord.contains(newTable[i])) {
                    System.out.println(inputWord.replace(newTable[i],table[i]));
                }
            }
        }
        public static void main(String[] args) {
            wordMatch("fucketic");
        }
    }



}

猜你喜欢

转载自blog.csdn.net/weianluo/article/details/80726861