热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

面试题-PHP算法逻辑:如何计算购买量?

题目:{代码...}程序:{代码...}答案:{代码...}求简洁的正确算法。
题目:

有36个人去游玩,需要买水,商店活动买3瓶赠送一瓶。
请问题目至少需要买多少瓶饮料才可以人手一瓶?

程序:


function mathBuy($total, $range = 3)
{
    $buy = $i = 0;
    while ($total > 0) {
        $total--;
        $i++;
        if ($i % $range == 0) {
            $i = 0;
        } else {
            $buy++;
        }
    }

    return $buy;
}

答案:

var_dump(mathBuy(36, 3)); // 计算结果24瓶,正确答案是27

求简洁的正确算法。

回复内容:

题目:

有36个人去游玩,需要买水,商店活动买3瓶赠送一瓶。
请问题目至少需要买多少瓶饮料才可以人手一瓶?

程序:


function mathBuy($total, $range = 3)
{
    $buy = $i = 0;
    while ($total > 0) {
        $total--;
        $i++;
        if ($i % $range == 0) {
            $i = 0;
        } else {
            $buy++;
        }
    }

    return $buy;
}

答案:

var_dump(mathBuy(36, 3)); // 计算结果24瓶,正确答案是27

求简洁的正确算法。

上午就看到这个问题了,一直没有回答。现在突然发现,这是个好问题。

就好比问:从 1 累加到 n,和是多少?

老师之所以教我们 for(i=1;i<=n;i++) sum+=i; 是为了教我们 for 循环的写法,而不是为了求1到n的累加和。我们遇到这种问题时,应该写 n*(n+1)/2

所以:

phpfunction mathBuy($total, $range = 3)
{
    return $total/($range+1)*$range;
}

谢谢 @Yian 的回复。修改一下。对于小数,需要向上取整。

phpfunction mathBuy($total, $range = 3)
{
    return ceil($total/($range+1)*$range);
}

感觉一行代码就好了啊,数学分析下就行。
只是针对这个题目而言,没有考虑到所有情况。

36/(3+1)*3 = 27

PHPfunction mathBuy($total, $range = 3)
{
    $remainder = $total % ($range + 1);
    $quotient = round($total / ($range + 1), 0);
    return $quotient * $range + $remainder;
}

P.S.题主说答案是24瓶,我有点费解 = =

手机码字,有点乱 题主你这个代码逻辑是错的。 举个栗子: 假如总共买4瓶水。走一下你的while逻辑

第一轮

total 3 i 1 buy 1

第二轮

total 2 i 2 buy 2

第三轮

total 1 i 0 buy 2 这里出错

第四轮

total 0 i 1 buy 3

买4瓶水看样子结果是正确的。但是由于你的逻辑错了,在第三次买水的时候就不需要掏钱了。你再理解理解。 对了,我是从你的程序员如何提高逻辑思维能力过来的。 改正

function mathBuy($total, $range = 3)
{
    $buy = $i = 0;
    while ($total > 0) {
        $total--;
        $i++;
        if ($i % ($range+1) == 0) {
            $i = 0;
        } else {
            $buy++;
        }
    }

    return $buy;
}

x + x/3 = 36
=> 4x/3 = 36

推广开还可以这样

function quantity($total, $present) 
{
    return ceil($total * $present / ($present + 1));
}

total为需要的总数,present买几瓶送一瓶,返回值便是,需要最少需要买多少瓶,ceil是当出现小数时强取整.

运行结果
$total : 36, $present: 3 => 27
$total : 76, $present: 4 => 61
$total : 105, $present: 5 => 88

大家都在用数学算法,我就给一很土的办法,按照机器的思维来判断

这个程序的逻辑就是,每次都买一瓶,然后看看手里的水有多少瓶,当水的数量和人的数量相等的时候就可以回家了

一元一次方程,水的单价为1,需要的支付为x,每支付3可以获得4瓶水,所以

$$ x * {4 / 3} = 36 $$

求得x为27

楼主大概是想说:每三个空瓶子可以再换一瓶满的吧?

php是世界上最好的语言,没有之一

推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了同事工资打听的话题,包括同工不同酬现象、打探工资的途径、为什么打听别人的工资、职业的本质、商业价值与工资的关系,以及如何面对同事工资比自己高的情况和凸显自己的商业价值。故事中的阿巧发现同事的工资比自己高后感到不满,通过与老公、闺蜜交流和搜索相关关键词来寻求解决办法。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • faceu激萌变老特效的使用方法详解
    本文介绍了faceu激萌变老特效的使用方法,包括打开faceu激萌app、点击贴纸、选择热门贴纸中的变老特效,然后对准人脸进行拍摄,即可给照片添加变老特效。操作简单,适合新用户使用。 ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
  • 给定一个二叉树,要求随机选择树上的一个节点。解法:遍历树的过程中,随机选择一个节点即可。具体做法参看:从输入 ... [详细]
  • 本文介绍了在微店中如何修改分销产品的价格以及设置价格的方法。客户在拍下商品后,在1小时内可以进行修改价格的操作,通过进入订单管理,点击未付款子项,可以找到订单信息并进行改价操作。修改价格后,买家会收到改价后的短信通知,在微店订单中进行付款即可。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 夏侯惇在曹魏集团的地位及其重要性
    本文介绍了夏侯惇在曹魏集团中的地位及其重要性。夏侯惇虽然没有特别显赫的战绩,但是他是曹操最信任的军事将领。通过对夏侯惇生平经历的回顾,可以看出他在曹魏集团的重要地位。从曹魏集团的二号人物到裨将、司马等职位的担任,夏侯惇一直是曹操最亲信的人之一。夏侯惇的历史地位在曹魏集团中不可忽视。 ... [详细]
author-avatar
金裕麟雯茂俊佑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有