C语言喝酒问题

文章描述了一个涉及数学和编程的问题,即在n个人中,如何分配3瓶啤酒,使得每人至少喝到一瓶,且有一个人喝到3瓶的总和。通过循环和逻辑判断,使用C语言找出满足条件的i,j,k值,输出结果。若无解则输出Nosolution。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值