算法设计与分析-----第四章课后习题

(2)猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,有多吃了两个,第二天早上又将剩下的桃子吃掉一半,又多吃了两个,以后每天早上都吃了前一天剩下的一半零两个,到第10天早上在想吃时就只剩下两个桃子了。问第一天猴子摘下多少个桃子?
#include<stdio.h>
int main(){
	int x = 2;
	for(int i = 9; i >= 1; i--)
			x = (x+2)*2;
	printf("%d",x);
	return 0;
}


(7)有一堆棋子,2枚2枚的数,最后余1枚;3枚3枚的数,最后余3枚;4枚4枚的数,最后余3枚;5枚5枚的数,最后余4枚;6枚6枚的数,最后余5枚;只有7枚7枚的数,最后正好数完。编程求出这堆棋子最少有多少枚棋子。

#include <stdio.h>
int main(){
	int i = 7;
	while(1){
		if(i%2==1&&i%3==2&&i%4==3&&i%5==4&&i%6==5)
			break;
		i += 7;
	}
	printf("%d", i);
	return 0;
} 

(9)利用分治法求一组数据中最大的两个数和最小的两个数。

#include <stdio.h>
int a[] = {2, 3, 4, 5, 34, 7, 9, 6, 43, 21}; 
void getminmax(i, j, *min1, *min2, *max2, *max1);
int main(){
	int min1, min2, max1, max2;
	int n = sizeof(a / a[0]);
	getminmax(0, n-1, &min1, &min2, &max2, &max1);
	printf("min1=%d min2=%d max1=%d max2=%d", min1, min2, max2, max1);
	return 0;
}
void getminmax(i, j, *min1, *min2, *max2, *max1){
	int mid;
	int lmin1,lmin2,lmax1,lmax2;  
	int rmin1,rmin2,rmax1,rmax2;  
	if(i == j)
		*min1 = *min2 = *max1 = *max2 = a[i];
	else if(i == j-1)
		if(a[i]<a[j]){
			*max1 = a[j];
			*max2 = a[i];
			*min1 = a[i];
			*min2 = a[j];
		}
		else{
			*max1 = a[i];
			*max2 = a[j];
			*min1 = a[j];
			*min2 = a[i];
		}
	else{
		mid = (i+j)/2;
		getminmax(i, mid, &lmin1, &lmin2, &lmax2, &lmax1);
		getminmax(mid+1, j, &rmin1, &rmin2, &rmax2, &rmax1);
		if(lmin1 < rmin1){
			if(lmin2 < rmin1){
				*min1 = lmin1;
				*min2 = lmin2;
			}
			else{
				*min1 = lmin1;
				*min2 = rmin1;
			}
		}
		else
			if(lmin1 > rmin2){
				*min1 = rmin1;
				*min2 = rmin2;
			}
			else{
				*min1 = rmin1;
				*min2 = lmin1;
			}
		if(lmax1>rmax1)
			if(lmax2>rmax1){
				*max1=lmax1;
				*max2=lmax2;
			}
			else{
			*max1=lmax1;
			*max2=rmax1;
			}
		else
			if(rmax2>lmax1){
				*max1=rmax1;  
				*max2=rmax2;
			}
			else{
				*max1=rmax1;  
				*max2=lmax1;
			}
	}
}

(8)利用分治法求一组数据的和。

#include<stdio.h>
int getsum(int *a, int i, int j);
int main(){
	int a[] = {1, 5, 6, 6, 9, 4, 2, 3};
	int n = sizeof(a)/sizeof(a[0]);
	printf("sum=%d", getsum(a, 0, n-1));
	return 0;
}
int getsum(int *a, int i, int j){
	if(i == j){
		return a[i];
	}
	else if(i == j-1){
		return a[i]+a[j];
	}
	else{
		int mid = (i+j)/2;
		return getsum(a, i, mid)+getsum(a, mid+1, j);
	}
}

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值