查看原文
其他

《Python语言》1.5编程基础之循环控制(16-30题)题解

okeylove 信息科技时代 2024-03-15

题目测试地址:点击阅读原文即可打开

http://noi.openjudge.cn/ch0105/

Python题解

《Python语言》开发环境的搭建python3.7

《Python语言》noi.openjudge.cn1.1编程基础之输入输出题解

《Python语言》1.3编程基础之算术表达式与顺序执行(1)

《Python语言》1.3编程基础之算术表达式与顺序执行(2)

《Python语言》1.4编程基础之逻辑表达式与条件分支

《Python语言》1.5编程基础之循环控制(1-15题)题解

16:买房子

描述

某程序员开始工作,年薪N万,他希望在中关村公馆买一套60平米的房子,现在价格是200万,假设房子价格以每年百分之K增长,并且该程序员未来年薪不变,且不吃不喝,不用交税,每年所得N万全都积攒起来,问第几年能够买下这套房子?(第一年年薪N万,房价200万)

输入

一行,包含两个正整数N(10 <= N <= 50), K(1 <= K <= 20),中间用单个空格隔开。

输出

如果在第20年或者之前就能买下这套房子,则输出一个整数M,表示最早需要在第M年能买下,否则输出Impossible。

样例输入

50 10

样例输出

8

参考程序:

n,k=map(int,input().split()) m=1 s1=n s2=200 while m<=20 and s1<s2: m+=1 s1+=n s2*=1+k/100 if s1<s2: print('Impossible') else: print(m)


17:菲波那契数列

描述

菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。

给出一个正整数k,要求菲波那契数列中第k个数是多少。

输入

输入一行,包含一个正整数k。(1 <= k <= 46)

输出

输出一行,包含一个正整数,表示菲波那契数列中第k个数的大小

样例输入

19

样例输出

4181

参考程序:

n=int(input()) x=1 y=1 s=1 for i in range(n-2): s=x+y x=y y=s print(s)


18:鸡尾酒疗法

描述

鸡尾酒疗法,原指“高效抗逆转录病毒治疗”(HAART),由美籍华裔科学家何大一于1996年提出,是通过三种或三种以上的抗病毒药物联合使用来治疗艾 滋病。该疗法的应用可以减少单一用药产生的抗药性,最大限度地抑制病毒的复制,使被破坏的机体免疫功能部分甚至全部恢复,从而延缓病程进展,延长患者生 命,提高生活质量。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式 进行。假设鸡尾酒疗法的有效率为x,新疗法的有效率为y,如果y-x大于5%,则效果更好,如果x-y大于5%,则效果更差,否则称为效果差不多。下面给 出n组临床对照实验,其中第一组采用鸡尾酒疗法,其他n-1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。

输入

第一行为整数n( 1 < n <= 20);

其余n行每行两个整数,第一个整数是临床实验的总病例数(小于等于10000),第二个疗效有效的病例数。

这n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。

输出

有n-1行输出,分别表示对应改进疗法的效果:

如果效果更好,输出better;如果效果更差,输出worse;否则输出same

样例输入

5

125 99

112 89

145 99

99 97

123 98

样例输出

same

worse

better

same

参考程序:

n=int(input()) a,b=map(int,input().split()) x=b/a for i in range(n-1): a,b=map(int,input().split()) y=b/a if y-x>0.05: print("better") elif x-y>0.05: print("worse") else: print("same")


19:救援

描述

救生船从大本营出发,营救若干屋顶上的人回到大本营,屋顶数目以及每个屋顶的坐标 

和人数都将由输入决定,求出所有人都到达大本营并登陆所用的时间。 

在直角坐标系的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。坐标系中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表 示。救生船每次从大本营出发,以速度50 米/分钟驶向下一个屋顶,达到一个屋顶后,救下其上的所有人,每人上船1 分钟,船原路返回,达到大本营,每人下船0.5 分钟。假设原点与任意一个屋顶的连线不穿过其它屋顶。

输入

第一行,一个整数,表示屋顶数n。

接下来依次有n 行输入,每一行上包含两个表示屋顶相对于大本营的平面坐标位置的实数(单位是米)、一个表示人数的整数,数之间以一个空格分

开。

输出

一行,救援需要的总时间,精确到分钟 (向上取整)。

样例输入

1

30 40 3

样例输出

7

参考程序:

import math n=int(input()) s=0 t=0 for i in range(n): a,b,c=map(float,input().split()) s=math.sqrt(a**2+b**2) t+=2*s/50+1.5*c print(math.ceil(t))


20:球弹跳高度的计算

描述

一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下。

编程计算气球在第10次落地时,共经过多少米? 第10次反弹多高?

输入

输入一个整数h,表示球的初始高度。

输出

输出包含两行:

第1行:到球第10次落地时,一共经过的米数。

第2行:第10次弹跳的高度。

注意:结果可能是实数,结果用double类型保存。

提示:输出时不需要对精度特殊控制,用cout << ANSWER,或者printf("%g", ANSWER)即可。

样例输入

20

样例输出

59.9219

0.0195313

参考程序:

h=int(input()) s=h h=h/2 for i in range(9): s+=2*h h=h/2 print("%g"%(s)) print("%g"%(h))


21:角谷猜想

描述

所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。 

程序要求输入一个整数,将经过处理得到1的过程输出来。

输入

一个正整数N(N <= 2,000,000)

输出

从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。

样例输入

5

样例输出

5*3+1=16

16/2=8

8/2=4

4/2=2

2/2=1

End

参考程序:

n=int(input()) while n!=1: if n%2==0: print("%d/2=%d"%(n,n//2)) n=n/2 else: print("%d*3+1=%d"%(n,n*3+1)) n=n*3+1 print("End")


22:津津的储蓄计划

描述

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

输入

包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月津津的预算。

输出

包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年年末津津手中会有多少钱。

样例输入

样例 #1:

290

230

280

200

300

170

340

50 

90 

80 

200

60

样例 #2:

290 

230 

280 

200 

300 

170 

330 

50 

90 

80 

200 

60

样例输出

样例 #1:

-7

样例 #2:

1580

来源

NOIP2004复赛 提高组 第一题

参考程序:

ans=0 x=0 for i in range(12): p=int(input()) x+=300-p if x>=100: ans+=x//100*100 x=x%100 if x<0: i=-i-1 print(i) break if x>=0: print(x+ans*6//5)


23:药房管理

描述

   随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分。计算机可以很好地辅助医院管理医生信息、病人信息、药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多精力投入真正的医疗过程中,从而极大地提高了医院整体的工作效率。 

    对药品的管理是其中的一项重要内容。现在药房的管理员希望使用计算机来帮助他管理。假设对于任意一种药品,每天开始工作时的库存总量已 知,并且一天之内不会通过进货的方式增加。每天会有很多病人前来取药,每个病人希望取走不同数量的药品。如果病人需要的数量超过了当时的库存量,药房会拒 绝该病人的请求。管理员希望知道每天会有多少病人没有取上药。

输入

共3行

第一行是每天开始时的药品总量m

第二行是这一天取药的人数n(0 < n <= 100)

第三行共有n个数,分别记录了每个病人希望取走的药品数量(按照时间先后的顺序),两数之间以空格分隔

输出

只有1行,为这一天没有取上药品的人数。

样例输入

30

6

10 5 20 6 7 8

样例输出

2

参考程序:

m=int(input()) n=int(input()) s=map(int,input().split()) ans=0 for x in s: if m-x>=0: m-=x else: ans+=1 print(ans)


24:正常血压

描述

监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。

输入

第一行为一个正整数n,n < 100

其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压,中间以一个空格分隔。

输出

输出仅一行,血压连续正常的最长小时数。

样例输入

4

100 80

90 50

120 60

140 90

样例输出

2

参考程序:

n=int(input()) s=0 ans=0 for i in range(n): a,b=map(int,input().split()) if a>=90 and a<=140 and b>=60 and b<=90: s+=1 ans=max(ans,s) continue s=0 print(ans)


25:求特殊自然数

描述

一个十进制自然数,它的七进制与九进制表示都是三位数,且七进制与九进制的三位数码表示顺序正好相反。编程求此自然数,并输出显示。

输入

无。

输出

三行:

第一行是此自然数的十进制表示;

第一行是此自然数的七进制表示;

第一行是此自然数的九进制表示。

样例输入

(无)

样例输出

(不提供)

参考程序:

g7=0 s7=0 b7=0 g9=0 s9=0 b9=0 for x in range(100,1000): b7=x//49 b9=x//81 if b7>9 or b9>9 or b7==0 or b9==0: continue s7=x%49//7 s9=x%81//9 if s7!=s9: continue g7=x%7 g9=x%9 if g7!=b9 or g9!=b7: continue print(x) print("%d%d%d"%(b7,s7,g7)) print("%d%d%d"%(b9,s9,g9))


26:统计满足条件的4位数个数

描述

给定若干个四位数,求出其中满足以下条件的数的个数: 

个位数上的数字减去千位数上的数字,再减去百位数上的数字, 再减去十位数上的数字的结果大于零。

输入

输入为两行,第一行为四位数的个数n,第二行为n个的四位数,数与数之间以一个空格分开。(n <= 100)

输出

输出为一行,包含一个整数,表示满足条件的四位数的个数。

样例输入

5

1234 1349 6119 2123 5017

样例输出

3

参考程序:

n=int(input()) s=map(int,input().split()) a=0 b=0 c=0 d=0 ans=0 for x in s: a=x%10 b=x//10%10 c=x//100%10 d=x//1000 if a-b-c-d>0: ans+=1 print(ans)


27:级数求和

描述

已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。

现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

输入

一个整数K。

输出

一个整数n。

样例输入

1

样例输出

2

来源

NOIP2002复赛 普及组 第一题

参考程序:

k=int(input()) n=1 sn=1 while sn<=k: n+=1 sn+=1/n print(n)


28:分离整数的各个数位

描述

给定一个整数,要求从个位开始分离出它的每一位数字。

输入

输入一个整数,整数在1到100000000之间。

输出

从个位开始按照从低位到高位的顺序依次输出每一位数字。数字之间以一个空格分开。

样例输入

123

样例输出

3 2 1

参考程序:

s=input() ans='' for i in range(len(s)-1,-1,-1): ans+=s[i]+' ' print(ans)


29:数字反转

描述

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。

输入

输入共 1 行,一个整数N。

-1,000,000,000 ≤ N≤ 1,000,000,000。

输出

输出共 1 行,一个整数,表示反转后的新数。

样例输入

样例 #1:

123

样例 #2:

-380

样例输出

样例 #1:

321

样例 #2:

-83

来源

NOIP2011复赛 普及组 第一题

参考程序:

s=input() ans='' t=[] flag=0 if s[0]=='-': ans+='-' t=s.split('-') s=t[1] for c in s[::-1]: if flag==0 and c=='0': continue flag=1 ans+=c print(ans)


30:含k个3的数

描述

输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。 

例如,输入: 

43833 3 

满足条件,输出YES。

如果输入:

39331 3 

尽管有3个3,但不能被19整除,也不满足条件,应输出NO。

输入

m 和 k 的值,中间用单个空格间隔。

输出

满足条件时输出 YES,不满足时输出 NO。

样例输入

43833 3

样例输出

YES

参考程序:

m,k=map(int,input().split()) n=m ans=0 while m>0: if m%10==3: ans+=1 m=m//10 if n%19==0 and k==ans: print('YES') else: print('NO')


图文编辑:陈鸥辉

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存