(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);
}
}