smile1110 发表于 2017-1-23 21:37

简单的数学题(能喝几瓶矿泉水?) 修正二

本帖最后由 smile1110 于 2017-1-28 06:44 编辑

原题:商店老板搞活动,老板不允许赊账,有n瓶矿泉水,每n个空瓶可以换一个新的,问最多能喝多少瓶矿泉水?
修正二:


我又咨询了一下大神,104瓶矿泉水,每3空瓶兑换1瓶,会输出136,而答案是137,因为第一次循环过程中留下的3和第二次循环过程中留下的1 加起来也能兑换1瓶,只要简单的确定一下n>=f即可解决这个问题,这下程序总算没有啥问题了。

#include <stdio.h>

int main()
{
    int n,f,total;

    while(scanf("%d%d",&n,&f)!=EOF)
    {
      total=n;
      if(n==0&&n==0)
      {
            total=n+f;
            printf("%d",total);
      }

      else
      {
            while(n>=f)
            {
                n=n-f+1;
                total=total+1;
            }

            printf("%d",total);
      }

    }
}
修正一:



现在买1w瓶矿泉水,每5空瓶兑换1个新的,那总共可以兑换12499瓶,啧啧。想了大半天,这样就可以实现被除数k被整除n-1次仍然可以被整除的问题了,解决让n可以大于k两倍的局限性。

#include <stdio.h>

int main()
{
    int n,k,total;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
      total=n;
      if(n==0&&k==0)
            {
            total=n+k;
            printf("%d",total);
            }
      else
      {
         while(n>k)
          {
      n=n-k+1;
      total=total+1;
         }
      printf("%d",total);
          }
    }
       return 0;
}



原文:问题一:petter 有n支香烟,每k个烟头可以换一支新烟,问一共能抽多少支香烟?
问题二:商店老板搞活动,老板不允许赊账,有n瓶矿泉水,每k个空瓶可以换一个新的,问最多能喝多少瓶矿泉水?
这俩题目是同一个问题

大神的写的程序循环了3次,我的解决办法仅仅是判断一次就根据公式出结果了,思路如下:

这题目明显 一共三种情况,第一种n和k全是负数没意义
第二种,n和k相等是0或者1,那自然能抽n+k支香烟
第三种,n>k,那自然能抽 (n除以k)+(n除以k 再除以k)....+n支香烟了,不过我暂时只会让程序除两次




#include <stdio.h>
//petter 有n支香烟,每k个烟头可以换一支新烟
//问一共能抽多少支香烟?
int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
      if(n==0&&k==0)
      printf("%d",n+k);
      else
      printf("%d",n/k/k+n/k+n);
    }
return 0;
}


验证一下,输入100和5进去试试。假如买了100瓶矿泉水,每5瓶能兑换一瓶,那先拿着100瓶兑换20瓶,接着拿着那20瓶兑换4瓶,最后4瓶少一瓶无法兑换了,而且老板不允许赊账,那只能喝100+20+4=124瓶。




奉聪 发表于 2017-1-23 22:52

大神,小弟有疑问:第二种情况 n == k会不会,一直抽烟啊,还是只能换一次?你的公式表示你只换两次,可能存在换多次情况
然后看看我的解法(输出结果一样,但是我初步判断你的解法有点问题,如有不对还请大神指点):#include<stdlib.h>
#include<stdio.h>

void main()
{
        //先买了n瓶水,k个瓶盖换一瓶
        //能喝多少水
       
        int n = 100;// 用n来存储,现在手上有多少瓶盖
        int k = 5; //用k来存储,用k个瓶盖换一个瓶水
        int allwater = n;//用来存储一共喝了多少瓶水
        while (n >= k)//我认为n小于k的时候就换不了
        {
                allwater +=( n / k);
                n = n / k + n % k;//手上有的瓶盖等于换来的水和剩下的
        }
        printf("%d,%d\n", n, allwater);


        system("pause");
}

奉聪 发表于 2017-1-24 13:17

pyglklg 发表于 2017-1-24 12:27
我测试了一下你的最新代码,n=103 , k=4 的时候还是有点问题,总数等于136。。。应该是137,我昨天自己弄的 ...

递归照样可以做,重要的是找到终止条件。
也许我的代码对你有帮助,有问题请指正,输出结果为137
#include<stdlib.h>
#include<stdio.h>
//2017年1月24日13:04:03
//对于昨天的喝水问题的递归实现
//之前是用循环实现的,抓住问题实质,都很好解决
//实质就是只要手上瓶盖n小于k(每k个瓶盖换一瓶)就换不了了



int drinkwater(int n,int k)
{
        if (n < k)
                return 0;//如果n小于k,那就换不了了
        return n/k + drinkwater(n / k + n%k, k);
}

void main()
{
        int n = 103;//先买103瓶,喝饱再说
        int k = 4;   //四个盖子,换一个
        int allwater = n;//那么初识条件就喝了103瓶
        allwater += drinkwater(n,k); //手上103个瓶盖,走,我请客去换水喝

        printf("%d\n", allwater);//输出结果为 137

        system("pause");
}

1888888 发表于 2017-1-23 21:45

@smile1110初学c,问下【 while】函数是什么意思

smile1110 发表于 2017-1-23 21:50

本帖最后由 smile1110 于 2017-1-23 22:15 编辑

1888888 发表于 2017-1-23 21:45
@smile1110初学c,问下【 while】函数是什么意思
while和for都是c语言当中的循环语句,其目的是让程序无限通过循环的方法,把寄存器的数值放到堆栈顶部,然后把堆栈顶部的结果,加载到下一次循环中的寄存器当中继续参与运算,直到循环体中止,whie因为不需要设定程序最终需要循环到的总数),所以比较常用

1888888 发表于 2017-1-23 21:58

本帖最后由 1888888 于 2017-1-23 22:02 编辑

smile1110 发表于 2017-1-23 21:50
while和for都是c语言当中的循环语句,其目的是让程序无限通过循环的方法,把寄存器的数值放到堆栈顶部, ...
谢谢了,另外第二种方式【第二种,n和k相当,那自然能抽n+k支香烟】有错误吧
如 petter 有2支香烟,每2个烟头可以换一支新烟,问一共能抽多少支香烟?
不只可抽3支吗   按你的2+2是4支了
有理解错误请谅解 @smile1110

smile1110 发表于 2017-1-23 22:08

本帖最后由 smile1110 于 2017-1-23 22:10 编辑

1888888 发表于 2017-1-23 21:58
谢谢了,另外第二种方式【第二种,n和k相当,那自然能抽n+k支香烟】有错误吧
如 petter 有2支香烟,每2 ...
好像是有点错误,我再改改,不过程序没错,仅仅是表达错误了,我设想的n和k 相等是0或者1的时候,若不是这两种情况,那又得按照第三种公式计算了

1888888 发表于 2017-1-23 22:30

本帖最后由 1888888 于 2017-1-23 22:32 编辑

感觉又有点错误(不是故意找茬),【第二种,n和k相当,那自然能抽n+k支香烟】
按你说,是1的话,那就无限循环了
设想,抽了一支,换了新的一支,继续换,继续抽
所以第二种只能是0
有理解错误请谅解 @smile1110

杰西道格拉斯 发表于 2017-1-23 22:46

我觉得大神的思路比较准确些,但是就不太好实现,哈哈!
亲,有没有想过一种极端的情况?1 1不应该是无穷吗?{:301_991:}
printf个无穷是不是又是一种情况{:301_997:}

smile1110 发表于 2017-1-23 22:56

1888888 发表于 2017-1-23 22:30
感觉又有点错误(不是故意找茬),【第二种,n和k相当,那自然能抽n+k支香烟】
按你说,是1的话,那就无限 ...

不错不错 ,若是输入是1的话,确实程序在后台循环,那就需要使用break来暂停了,不过由于计算完毕结果就关掉了,那几乎没有任何影响的。并且绝大多数人不会输入全是1,那就进入第三种公式运算了

smile1110 发表于 2017-1-23 23:03

本帖最后由 smile1110 于 2017-1-24 02:05 编辑

奉聪 发表于 2017-1-23 22:52
大神,小弟有疑问:第二种情况 n == k会不会,一直抽烟啊,还是只能换一次?你的公式表示你只换两次,可能 ...
真棒,我刚学习呐,你这个我还没看懂=.6,不过1w瓶计算出来12499是无比正确的。在我能力范围之内也想到了一个解决办法,已更新,你瞅瞅
页: [1] 2 3
查看完整版本: 简单的数学题(能喝几瓶矿泉水?) 修正二