編程珠璣第三章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;
        }
        }
    }  
}

運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章