n个人同桌吃饭(n<20),其中一个是数学家,他出了一道难题:假定桌子上有3瓶啤酒,将每瓶中的酒平分给几个人喝,但喝各瓶酒的人数是不一样的,不过其中有且只有一个人喝了每一瓶中的酒,且加起来刚好是一瓶,另外,还要保证n个人都有酒喝,请问喝这3瓶酒的各有多少人。
输入
有多组测试数据,每行输入总人数n。输入到文件结尾符为止。
输出
输出这三杯酒分别被几个人喝,三个数字从小到大排列。如果无解,输出“No solution”。

其实这个问题不复杂,有意思的点在于我们如何用C语言去描述并解决这个实际问题。
我们先从数学的角度考虑它。
设三瓶酒依次被分给i,j,k个人,并由“喝各瓶酒的人数是不一样的,不过其中有且只有一个人喝了每一瓶中的酒”,不妨设2<=i<3<=j<k<=n(根据1/i+1/j+1/k=1利用不等式放缩得到),进而我们可以知道i=2<j<k<=n。
下面要做的就是利用C语言描述并解决问题了。容易想到去用循环。后面的编程是不难的,直接放代码嘿嘿。大家感兴趣可以看下注释。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,k,flag=0;//Evert bottle is assigned to i,j,k people particularly,
//1/i+1/j+1/k=1
//and let i<j<k. Thus we have 2<=i<3<=j<k,and k>3,i<3
//i,j,k is not equal
i=2;
for(j=i+1;j<=n;j++)
{
for(k=j+1;k<=n;k++)
if(i*j+i*k+j*k==i*j*k
&&i+k+j>=n+2/*everyone has at least 1 glass*/
&&i+j+k<=2*n+2/*only one person has 3 glass*/)
{
printf("%d %d %d\n",i,j,k);flag=1;
}
}
if(!flag)printf("No solution\n");//No output
}
system("pause");
return 0;
}
文章描述了一个涉及数学和编程的问题,即在n个人中,如何分配3瓶啤酒,使得每人至少喝到一瓶,且有一个人喝到3瓶的总和。通过循环和逻辑判断,使用C语言找出满足条件的i,j,k值,输出结果。若无解则输出Nosolution。
371

被折叠的 条评论
为什么被折叠?



