汽水瓶(循环)-基础题25th + 阶乘最后的非0位(循环)-基础题26th + 算菜价(循环)-基础题27th
本文包含三个编程题目解析和一个英文段落翻译练习。编程题目分别是:1) 汽水瓶兑换问题,通过循环计算空瓶兑换汽水的最大数量;2) 阶乘最后非零位问题,通过分解质因数或截断末尾零的方法解决大数溢出问题;3) 菜价计算问题,使用四舍五入处理金额。英文段落对比了人工翻译和AI翻译版本,探讨了人工智能研究中智能体反应层级的分类问题。所有代码示例都附有详细解题思路和注意事项说明。
汽水瓶
属于循环的内容
题目
- 问题描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? - 输入说明
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。 - 输出说明
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。 - 输入范例
1
2
3
4
5
6
0
- 输出范例
0
1
1
2
2
3
解题思路
- 解答这题的思路主要在于怎么计算当前空瓶子的数量,若起始空瓶的数量为n则当进行一次换汽水时,剩余空瓶数量为n=(n%3)+(n/3),喝到的汽水a为a=a+(n/3)。
- 而由于借汽水的模式,当最后剩下两个空瓶时还可以换到一瓶汽水,此种情况下a++。
## 整体代码
```cpp
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n==0){
break;
}else{
int a=0;
while(n>=3){
a=a+(n/3);
n=(n%3)+(n/3);
}
if(n==2){
a++;
}
cout<<a<<endl;
}
}
return 0;
}
注意事项
- 注意输出的位置,不然会导致n=0时也输出结果,不符合题目要求。
阶乘最后的非0位
属于循环的内容
题目
- 问题描述
N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=12345=120所以5!的最后面的非零位是2,7!=1234567=5040,所以最后面的非零位是4。 - 输入说明
一个不大于1000的整数N。 - 输出说明
共一行,输出N!最后面的非零位。 - 输入范例
2
555 153
1233 52
- 输出范例
39
44 96
解题思路
- 本体的难点在于如果简单的计算阶乘再得出非零位则N>20 时就会溢出,即使不溢出,对于大数也会超时。
- 正确思路之一是和之前的一个计算阶乘后面有多少个零一样,计算N以内有多少个2和5的因子,然后算出抵掉5的因子还有多少个2的因子和其他的最后非零位相乘即可,需要用到的性质是只需要用最后的非零位乘以其他因子再取最后的非零位就可以保证非零位一直是一位数且不会出错。
- 还有一个正确思路就是阶乘过程中每次都把计算结果去掉末尾的0,只保留最后几位防止溢出,这两段代码都放在下面。
整体代码
#include<iostream>
using namespace std;
int main(){
int N;
cin>>N;
int count2=0,count5=0;
int lastnozero=1;
for(int i=1;i<=N;i++){
int num=i;
while(num%2==0){
num/=2;
count2++;
}
while(num%5==0){
num/=5;
count5++;
}
lastnozero=(lastnozero*(num%10))%10;
}
int nozerocount2=count2-count5;
for(int j=1;j<=nozerocount2;j++){
lastnozero=(lastnozero*2)%10;
}
cout<<lastnozero<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main(){
int N;
cin>>N;
int lastnozero=1;
for(int i=1;i<=N;i++){
lastnozero=lastnozero*i;
while(lastnozero%10==0){
lastnozero/=10;
}
lastnozero=lastnozero%10000;
}
cout<<lastnozero%10<<endl;
return 0;
}
注意事项
- 注意数据的溢出。
算菜价
属于循环的内容
题目
- 问题描述
妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐。现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵。 - 输入说明
输入含有一些数据组,第一行第一个数是测试组数,第二行第一个数据是菜种数,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价啊。菜种、数量和单价之间都有空格隔开的。
注意样例输入应是如下:
1
3
青菜 1 2
罗卜 2 1.5
鸡腿 2 4.2 - 输出说明
支付菜价的时候,由于最小支付单位是角,所以总是在支付的时候采用四舍五入的方法把分头去掉。所以,请输出一个精度为角的菜价总量。 - 输入范例
2
3
青菜 2 2.53
罗卜 3 1.55
鸡腿 3 4.25
4
青菜 1.5 2.53
罗卜 2 1.55
鸡腿 3.5 4.25
虾 2 12
- 输出范例
22.5
45.8
解题思路
- 本道题的主要思路在于怎么存入菜名,菜量和菜价,一开始考虑使用结构体,但由于菜的数量不确定,并且计算时其实只涉及数量和价格,只需要通过total+=quantity*price全部加在一起即可。
- 对于四舍五入,使用cmath中的数学函数round即可做到。
整体代码
#include<iostream>
#include<string>
#include<cmath>
#include<iomanip>
using namespace std;
int main(){
int N;
cin>>N;
for(int i=0;i<N;i++){
int T;
cin>>T;
double total=0.0;
for(int j=0;j<T;j++){
string name;
double quantity,price;
cin>>name>>quantity>>price;
total+=quantity*price;
}
total=round(total*10)/10.0;
cout<<fixed<<setprecision(1)<<total<<endl;
}
return 0;
}
注意事项
- 注意数学函数round只能四舍五入到整数。
英文段落翻译
自己翻译
许多在人工智能方面的研究,都是以建立一个有灵活的表现的智能体的背景为特征的,这意味着,智能体的执行器的行动是对来自它的传感器的数据的合理回应。从而,我们能够通过考虑不同水平的回应来分类这些研究。
最简单的回应是一个本能反应,这只不过是一个对输入数据的提前决定的回应。高水平的回应要求获得更多智慧的行为。例如我们可能授权给一个智慧体关于它的环境的知识并且要求这个智慧体相应的调节它的行为。扔一个棒球的进程是一个很大程度上的反射作用,但是决定怎样和哪里去扔这个球要求当前环境的知识。在人工智能方面,这些真实世界的知识怎样被存储、更新、获得,并且最终应用在决策进程上一直是一个具有挑战性的问题。
如果我们想要这个智能体寻找一个目标例如赢下一局棋,或者通过一个拥挤的走廊,这要求另一种水平的回应。这些直接目标的行为要求这个智能体的回应或者一系列回应,作为慎重形成一个行动的计划或在当前选择中选择最佳行动的结果。
AI翻译
人工智能领域的大部分研究,都可以置于构建具有智能行为的智能体这一语境下来理解。这意味着,智能体执行器的动作,必须是对其通过传感器接收到的数据作出的合理反应。相应地,我们可以通过考量这些反应的不同层级,对此类研究进行分类。
最基本的反应是反射动作,它仅仅是对输入数据的预定反应。要获得更“智能”的行为,则需要更高层级的反应。例如,我们可以赋予智能体关于其环境的知识,并要求它相应地调整其动作。投掷棒球的动作在很大程度上是一种反射行为,但判断如何投球以及投向何处,则需要关于当前环境的知识。此类现实世界知识应如何存储、更新、访问并最终应用于决策过程,依然是人工智能领域一个持续存在的挑战。
如果我们希望智能体追求特定目标(例如赢得一盘国际象棋或穿越拥挤的通道),则又需要另一种层级的反应。此类目标导向的行为,要求智能体的反应或反应序列,必须是经过审慎形成行动计划或在当前选项中选取最佳动作的结果。
下一篇
水果价格(循环)-基础题28th + 求奇数的乘积(循环)-基础题29th + 求最晚和最早日期(循环)-基础题30th
更多推荐



所有评论(0)