吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5416|回复: 31
收起左侧

[C&C++ 转载] 简单的数学题(能喝几瓶矿泉水?) 修正二

[复制链接]
smile1110 发表于 2017-1-23 21:37
本帖最后由 smile1110 于 2017-1-28 06:44 编辑

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

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

[Asm] 纯文本查看 复制代码
#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);
        }

    }
}
修正一:

2509修正.png

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

[C] 纯文本查看 复制代码
#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支香烟了,不过我暂时只会让程序除两次


2509.png

[C] 纯文本查看 复制代码
#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-24 12:05
勉强看懂,谢谢  发表于 2017-1-23 21:43

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

奉聪 发表于 2017-1-23 22:52
大神,小弟有疑问:第二种情况 n == k会不会,一直抽烟啊,还是只能换一次?你的公式表示你只换两次,可能存在换多次情况
然后看看我的解法(输出结果一样,但是我初步判断你的解法有点问题,如有不对还请大神指点):
[C] 纯文本查看 复制代码
#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");
}

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
smile1110 + 3 + 1 用心讨论,共获提升!

查看全部评分

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

递归照样可以做,重要的是找到终止条件。
也许我的代码对你有帮助,有问题请指正,输出结果为137
[C] 纯文本查看 复制代码
#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");
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
pyglklg + 1 + 1 我很赞同!

查看全部评分

1888888 发表于 2017-1-23 21:45
 楼主| 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不应该是无穷吗?
printf个无穷是不是又是一种情况
 楼主| 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是无比正确的。在我能力范围之内也想到了一个解决办法,已更新,你瞅瞅
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 04:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表