简单的数学题(能喝几瓶矿泉水?) 修正二
本帖最后由 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瓶。
大神,小弟有疑问:第二种情况 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");
} 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");
} @smile1110初学c,问下【 while】函数是什么意思 本帖最后由 smile1110 于 2017-1-23 22:15 编辑
1888888 发表于 2017-1-23 21:45
@smile1110初学c,问下【 while】函数是什么意思
while和for都是c语言当中的循环语句,其目的是让程序无限通过循环的方法,把寄存器的数值放到堆栈顶部,然后把堆栈顶部的结果,加载到下一次循环中的寄存器当中继续参与运算,直到循环体中止,whie因为不需要设定程序最终需要循环到的总数),所以比较常用 本帖最后由 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:10 编辑
1888888 发表于 2017-1-23 21:58
谢谢了,另外第二种方式【第二种,n和k相当,那自然能抽n+k支香烟】有错误吧
如 petter 有2支香烟,每2 ...
好像是有点错误,我再改改,不过程序没错,仅仅是表达错误了,我设想的n和k 相等是0或者1的时候,若不是这两种情况,那又得按照第三种公式计算了 本帖最后由 1888888 于 2017-1-23 22:32 编辑
感觉又有点错误(不是故意找茬),【第二种,n和k相当,那自然能抽n+k支香烟】
按你说,是1的话,那就无限循环了
设想,抽了一支,换了新的一支,继续换,继续抽
所以第二种只能是0
有理解错误请谅解 @smile1110
我觉得大神的思路比较准确些,但是就不太好实现,哈哈!
亲,有没有想过一种极端的情况?1 1不应该是无穷吗?{:301_991:}
printf个无穷是不是又是一种情况{:301_997:} 1888888 发表于 2017-1-23 22:30
感觉又有点错误(不是故意找茬),【第二种,n和k相当,那自然能抽n+k支香烟】
按你说,是1的话,那就无限 ...
不错不错 ,若是输入是1的话,确实程序在后台循环,那就需要使用break来暂停了,不过由于计算完毕结果就关掉了,那几乎没有任何影响的。并且绝大多数人不会输入全是1,那就进入第三种公式运算了 本帖最后由 smile1110 于 2017-1-24 02:05 编辑
奉聪 发表于 2017-1-23 22:52
大神,小弟有疑问:第二种情况 n == k会不会,一直抽烟啊,还是只能换一次?你的公式表示你只换两次,可能 ...
真棒,我刚学习呐,你这个我还没看懂=.6,不过1w瓶计算出来12499是无比正确的。在我能力范围之内也想到了一个解决办法,已更新,你瞅瞅