编程珠玑第三章3.7习题(1-4)

1.收税问题。
关注收税区间段的起始部分,结束部分,及此区间的税率;因为收税区间段都是每500$一个间隔且税率也随着收税区间的提高每次加上0.01;因而很容易得到下面的循环累加程序。

package chapter3;

public class t1 {
    public static float getTax(int income){
        float taxRate=0.14f;
        float tax=0;
        int cur_taxed_range_start=2200;//表示当前收税的区间段的开始部分
        while(income>cur_taxed_range_start){
            if(income>cur_taxed_range_start+500){
                tax+=500*taxRate;
                taxRate+=0.01;
                cur_taxed_range_start+=500;
            }
            else{
                tax+=(income-cur_taxed_range_start)*taxRate;
                break;//跳出循环,不可能再到下一个收税区间了
            }
        }
        return tax;

    }
    public static void main(String args[]){
        System.out.println(getTax(3400));
        System.out.println(getTax(4000));
    }

}

2.k阶常系数线性递归函数定义的级数问题
An=C1*An-1+C2*An-2+……+CkAn-k+Ck+1;
其中,C1,C2,….,Ck+1为实数,编写一个程序,其输入为k,A1,…,Ak,C1,…,Ck+1和m,至少输出为A1至Am
代码如下

package chapter3;

public class t2 {
    public  static int computeAn(int a[],int n,int c[]){
        for(int i=1;i<c.length-1;i++){
            a[n]+=c[i]*a[n-i];
        }
        a[n]+=c[c.length-1];
        return a[n];
    }
    public static void main(String [] args){
        int k=Integer.valueOf(args[0]);
        int m=Integer.valueOf(args[2*k+2]);
        int a[]=new int[m+1];
        for(int i=1;i<=k;i++){
            a[i]=Integer.valueOf(args[i]);
        }
        int c[]=new int[k+2];
        for(int i=1;i<k+2;i++){
            c[i]=Integer.valueOf(args[k+i]);
        }

        if(m>k){
            for(int i=k+1;i<=m;i++){
                computeAn(a, i, c);
            }
        }
        for(int i=1;i<=m;i++){
            System.out.print(a[i]+" ");
        }
    }
}

运行前进行配置,我实在myeclipse(eclipse类似),右击在run as 选择run configuration,进行如下配置配置图片
所以我的配置中设置k=4;a1,a2,a3,a4分别是1,2,3,4;c1到c5全为1;m=8;

运行结果

3.可以当个游戏写写看,只要将26个字母分别图形化表示即可。对于每个字母控制输出的空格及及用于表示字母的基本符号的个数,还有行数等等
4.编写处理如下日期问题的函数:给定两个日期,计算两者之间的天数;给定一个日期,返回值为周几;给定月和年,使用字符数组输出该月的日历
这里偷了点懒,用了Date的getTime函数,其实完全可以自己写的,但是有轮子不必自己造,Java甚至还有Calendar类,但是我发现使用有点问题就自己写了。

package chapter3;

import java.util.Date;
public class t3 {
    public static boolean judgeYear(int year){//如果是闰年返回true
        if(( year%100!=0 && year%4==0 )||(year%400==0)){
            return true;
        }
        return false;
    }
    public  static int getMonthDays(int month){
        switch (month) {
        case 2:
            return 28;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        default:
            return 31;
        }
    }
    public static void main(String [] args){
        Date date1=new Date(2016,8,21);//假定知道2016年8月21日为星期日
        Date date2=new Date(2016,8,1);
        long d1=date1.getTime();
        long d2=date2.getTime();
        long days;
        long oneDayMil=1000*3600*24;
        if(d1>d2)
            days=(d1-d2)/oneDayMil;
        else {
            days=(d2-d1)/oneDayMil;
        }
        System.out.println(days);
        int rest=(int) (days%7);
        String[] weeks={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
        if(d1-d2>oneDayMil){
            rest=(7-rest)%7;//日期date2如果是前面的话,就需要倒着数,因此用7减一下,又怕刚好是前面的相差的七天整数倍,导致rest=0,从而数组下标溢出,所以对7取模
        }
        int year=date2.getYear();
        int month=date2.getMonth();
        int ds;
        System.out.println(year+"-"+month+"-"+date2.getDate()+"是"+weeks[rest]);
        if(month==2){
            if(judgeYear(year)){
                ds=29;
            }
            else {
                ds=28;
            }
        }
        else{
            ds=getMonthDays(month);
        }
        System.out.println(year+"年"+month+"月");
        System.out.println(" 07  01  02  03  04  05  06");
        for(int i=0;i<rest*4;i++){
            System.out.print(" ");
        }
        int count=rest;
        for(int i=1;i<=ds;i++)
        {   if(i<10)
            System.out.print(" 0"+i+" ");
        else {
            System.out.print(" "+i+" ");
        }
        count++;
        if(count==7){
            System.out.println();
            count=0;
        }
        }
    }  
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值