(编程小白,自学备考,如有错误,还请批评指正)
分鱼问题二
甲、乙、丙三位渔夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐则是空的,由于他们没有秤,只好通过目测认为7个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐平分为3份?
思路:
将满筐记为2,半筐记为1,空筐记为0,总计为21,平均每人分得7。
每人满筐数为 1~3,半筐数为 1~6,空筐为7-满筐-半筐。
用三个一维数组a[3] b[3] c[3](也可以用一个二维数组)表示每人的各种筐的数量。
一仅考虑分法
#include<stdio.h>
int main()
{
int i, j, a[3], b[3], c[3];
for (i = 1; i<4; i++)//循环得到a的满筐数
{
a[0] = i;
a[1] = (7 - 2*i) ;//利用a的满筐数以及a总共应该分得3.5求得a的半筐数
a[2] = 7 - a[0] - a[1];//空筐数为7-半筐-满筐
if (a[1] > 0 && a[2] > 0)
{
for (j = 1; j<4; j++)//
{
b[0] = j;
b[1] = (7 - 2 * j);
b[2] = 7 - b[0] - b[1];
if (b[1] > 0 && b[2] > 0 && a[2] >= b[2])
{
c[0] = 7 - a[0] - b[0];//c的满筐数通过总满筐数减去ab的满筐数之和得到
c[1] = 7 - a[1] - b[1];
c[2] = 7 - c[0] - c[1];
if (c[0] + c[1] * 0.5 == 3.5&&c[2] > 0 && c[1] > 0 && b[2] >= c[2] )//c至少有一个半筐,要保证ab的半筐数小于等于6才可以正确计算c c[0]>=b[0]是为了过滤掉重复的情况
{
printf(“甲 满筐数 %d 半筐数 %d 空筐数 %d\n”, a[0], a[1], a[2]);
printf(“乙 满筐数 %d 半筐数 %d 空筐数 %d\n”, b[0], b[1], b[2]);
printf(“丙 满筐数 %d 半筐数 %d 空筐数 %d\n”, c[0], c[1], c[2]);
}
printf("\n");
}
}
}
}
return 0;
}
考虑所有情况
#include<stdio.h>
int main()
{
int i, j, a[3], b[3], c[3];
for (i = 1; i<4; i++)//循环得到a的满筐数
{
a[0] = i;
a[1] = (7 - 2*i) ;//利用a的满筐数以及a总共应该分得3.5求得a的半筐数
a[2] = 7 - a[0] - a[1];//空筐数为7-半筐-满筐
if (a[1] > 0 && a[2] > 0)
{
for (j = 1; j<4; j++)//
{
b[0] = j;
b[1] = (7 - 2 * j);
b[2] = 7 - b[0] - b[1];
if (b[1] > 0 && b[2] > 0)
{
c[0] = 7 - a[0] - b[0];//c的满筐数通过总满筐数减去ab的满筐数之和得到
c[1] = 7 - a[1] - b[1];
c[2] = 7 - c[0] - c[1];
if (c[0] + c[1] * 0.5 == 3.5&&c[2]>0 &&c[1]>0)//c至少有一个半筐,要保证ab的半筐数小于等于6才可以正确计算c c[0]>=b[0]是为了过滤掉重复的情况
{
printf(“甲 满筐数 %d 半筐数 %d 空筐数 %d\n”, a[0], a[1], a[2]);
printf(“乙 满筐数 %d 半筐数 %d 空筐数 %d\n”, b[0], b[1], b[2]);
printf(“丙 满筐数 %d 半筐数 %d 空筐数 %d\n”, c[0], c[1], c[2]);
}
printf("\n");
}
}
}
}
return 0;
}