编程珠玑 第三章 习题解答

于 2012年06月3日 发布在 算法&&ACM 跳到评论

为什么我看完这一章不知道该写啥?。。整体来看是比较基础的。

1.if-else语句的每个分支的形式都差不多,我们可以用数组来使循环简单一点。数组中每个点表明一个阶段,用level[i]表示阶段i的起始点,tax[i]表示阶段i的税率,用have [i]表示这个阶段已经有的税收,然后得到收入后二分到相应的阶段,计算税收。

2.不知所云(用递归实现应该很简单,不用数组的话代码量会比较大)。

3.这个不会,看了答案了。这个方法的精髓就是把重复出现n次的字符用 n+‘字符’来表示,重复出现的行用同样的方法可以得到。这个方法给了我很大的启示,以前没有思路的一道题目,瞬间来了灵感。

4.实现如下

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int month[13] = {
0,	31,	28,	31,	30,	31,	30,	31,	31,	30,	31,	30,	31
//	1	2	3	4	5	6	7	8	9	10	11	12
};

class D{
public:
	int year,mon,day;// 1900 <= year, 1 <= mon <= 12,
					// 1 <= day <= 31
	D(){}
	D(int y, int m, int d):
		year(y),mon(m),day(d){}

	int yearday(void){//返回这一天是这一年的第几天
		int sum = day;
		for( int i = 1; i < mon; i++ )
			sum += month[i];
		if( isrun() && mon > 2 )
			sum ++;
		return sum;
	}
	bool isrun( void ){//是否是闰年
		return (year%4==0&&year%100!=0)||(year%400==0);
	}
};

int dist( D d1, D d2 ){//两个日期相差的天数
	int sum = -(d1.yearday());
	for( ; d1.year < d2.year ; d1.year++ )
		sum += d1.isrun()?366:365;
	return sum + d2.yearday();
}

int xingqiji( D d ){//某一天是星期几
	D temp(1900,1,1);
	return dist( temp, d )%7+1;
}

int print(int year, int mon ){//输出某月日历
	D d(year, mon, 1 );
	int week = xingqiji(d);
	int sum = month[ mon ];
	for( int i = 1; i < week; i++ )
		cout << "	";
	for( int i = 1; i <= sum; i++){
		cout << i << "	";
		if( week == 7 ){
			week = 1;
			cout << endl;
		}
		else week++;
	}
	cout << endl;
}

int main(void){
	D a(2012,6,3);
	cout << xingqiji(a) << endl;
	print(1990,2);
	return 0;
}

5.从前到后进行比较,符合一个输出就行。

6.略。

7.其实,我没有看懂题意

8.转化为一道题目,是zoj1146,我的解答在这里。

留下评论!

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)