编程珠玑第三章习题

1.使用二分搜索来搜索大于等于income的最小的lower_limit

#include "stdafx.h"
#include <iostream>
using namespace std;

int binarysearch(int start, int end, int find, int* a);
int main(int argc, char* argv[])
{
	int lower_limit[40];
	int iter;
	int find;

	for(int i = 0; i < 40; i++) //初始化下限数组
	{
		lower_limit[i] = 2200 + i * 500; 
	}
	cin >> find;
	while(find != -1)
	{
		iter = binarysearch(0,39,find,lower_limit);
		cout << lower_limit[iter] <<endl;
		cin >> find;
	}
		return 0; 
}
int binarysearch(int start, int end, int find, int* a)
{
	int mid;
	if(start == end)
		return end;
	else 
	{
		mid = (start + end)/2;
		if(find <= a[mid])
			return(binarysearch(start,mid,find,a));
		else
			return(binarysearch(mid+1,end,find,a)); 
	}
} 

其实根本不用那么麻烦。。。还要用上二分搜索

其实观察书中下限的数据为2200,2700,3200,3700。。。

就是2200+i*500

那么只要将要找的数据find: 

  iter = (find-2200)/500;

  if((find-2200)%500 == 0)

return iter;

  else 

return iter +1;

就可以了,不用搜索。

2.没意思的递归

3.有点费时间,有时间再做

4.有意思的题:给定两个日期,计算两者之间的天数;给定一个日期,返回值为周几;给定月和年,使用字符数组生成该月的日历

先看下关于题目背景的科普知识:

问题的提出:日历的编排是每400年一个大循环周期,即今年的月、日、星期几和400年前的完全一样。现行天文历法根据天体运行规律,取每年365.2425天。这样,每400年共有365.2425×400=146097天。如果以365天作为一年,每400年就少了0.2425×400=97天。这97天要靠设置闰年(每年366)天来凑齐,所以,每400年要设置97个闰 -Of the problem: the structure of the calendar every 400 years is a big cycle, that is, this year' s month, day, week and 400 a few years ago, exactly the same. Existing astronomical calendar to run in accordance with the laws of celestial bodies, 365.2425 days a year access. In this way, every 400 years a total of 365.2425 × 400 = 146097 days. As if 365 days a year, every 400 years less 0.2425 × 400 = 97 days. This is a leap year 97 days depends on the set (366 a year) days to put together, so every 400 years a leap to set up 97

#include "stdafx.h"
#include <iostream>
using namespace std;
struct date
{
	int year;
	int mouth;
	int day;
};
int mouth_date[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int MakeCalender(int year, int mouth);
void PrintCalender(int lines);
int DateToDays(struct date d);
	int Cal[6][7];
void InitialCal()
{
	for(int i = 0; i < 6; i++)
		for(int j = 0; j < 7; j++)
			Cal[i][j] = 0;
}


int main(int argc, char* argv[])
{


	int lines = MakeCalender(2012,1);	
	PrintCalender(lines);
	return 0;
}


int IsLeapYear(int year)//能被400整除的年份 或 不能被100整除却能被4整除的年份是闰年. 
{
	if((year%400 == 0) || ((year%4== 0) && (year%100 != 0)))
		return 1; //是闰年
	else 
		return 0;
}
int cmpDate(struct date cmp, struct date cmp1) //如果cmp < cmp1,则返回-1,大于返回1,等于返回0
{
	if(cmp.year < cmp1.year)
		return -1;
	if(cmp.year > cmp1.year)
		return 1;
	if(cmp.mouth < cmp1.mouth)
		return -1;
	if(cmp.mouth > cmp1.mouth)
		return 1;
	if(cmp.day < cmp1.day)
		return -1;
	if(cmp.day > cmp1.day)
		return 1;
	return 0;
}


int IntervalDays(struct date begin, struct date end)
{
	return DateToDays(end) - DateToDays(begin);
	
}


int DateToDays(struct date d)
{
	int days = 0;
//	int temp;


	days += (d.year - 1)*365 + (d.year - 1)/4 - (d.year-1)/100 + (d.year -1 )/400;
	if(IsLeapYear(d.year))
		mouth_date[1] = 29;
	for(int i = 1; i < d.mouth; i++)
	{
		days += mouth_date[i-1];
	}
	days += d.day;
	mouth_date[1] = 28;
	return days;
}


int XingQi(struct date d)
{
	struct date today;
	today.year = 2011;
	today.mouth = 12;
	today.day = 30;
	int xingqi = 5;
	int interval = 0;


	if(cmpDate(d,today) == -1)
	{
		interval = IntervalDays(d,today) % 7;
		xingqi = (xingqi + (7 - interval))%7;
		return xingqi;
	}
	if(cmpDate(d,today) == 1)
	{
		interval = IntervalDays(today,d) % 7;
		xingqi = (xingqi + interval)%7;
		return xingqi;
		return xingqi;
}


int MakeCalender(int year, int mouth)
{
	struct date temp;
	temp.year = year;
	temp.mouth = mouth;
	temp.day = 1;


	if(IsLeapYear(year))
		mouth_date[1] = 29;


	int j = XingQi(temp);
	for(int i = 0; i <mouth_date[mouth-1]; i++)
	{
		Cal[j/7][j%7] = i+1;
		j++;
	}
	return (j-1)/7 + 1;    //返回行数
}


void PrintCalender(int lines)
{
	//Cal[0] ={'日','一','二','三','四','五','六'}
	cout<<"\t日"<<"\t一"<<"\t二"<<"\t三"<<"\t四"<<"\t五"<<"\t六"<<endl;
	for(int i = 0; i <lines; i++)
	{
		for(int j = 0; j < 7; j++)
		{
			if(Cal[i][j]!=0)
			cout<<'\t'<<Cal[i][j];
			else
			cout<<'\t';
		}
		cout << endl;
	}
}

看到别人写的cmp函数很优雅,贴上来当学习了

//比较时间  int datecmp(date a, date b)  {      if (a.year != b.year) return a.year - b.year;      if (a.month != b.month) return a.month - b.month;      return a.day - b.day;  }  


5.写了一个很弱的程序

// ProgramPearl3_5.cpp : Defines the entry point for the console application.
//
#include "stdafx.h" 
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iterator>
#include<iostream>

using namespace std;
#define MAX 10;

char* pp[24] = {"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"};

int IsEqual(const char* a, const char *b);
char* reverseString(char * p);

int main()
{
	char p[24][10];
	
	for(int i = 0; i < 24; i++)
	{
		strcpy(p[i],pp[i]);
		reverseString(p[i]);
	}
//	qsort(a,24,sizeof(struct affix),cmp);
	char find[10] = "eth-nic";
	cout << p[10] << endl;
	reverseString(find);
	cout << find << endl;
	for( i = 0; i < 24; i++)
	{
		if(IsEqual(find,p[i]))
			break;
	}
	cout << i << endl;

	return 0;
}


char* reverseString(char * p)
{
	int n = strlen(p);
	char temp;

	for(int i = 0; i <= (n/2); i++)
	{
		temp = p[i];
		p[i] = p[n-1-i];
		p[n-1-i] = temp;
	}
	return p;
}

int IsEqual(const char* a, const char *b)
{
	
	for(int i = 0; i < strlen(b); i++)
	{
		if((b[i] != a[i]) || (a[i] == '\0'))
			break;
	}
	if(i == strlen(b))
		return 1;
	else return 0;
}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值