通过PTA刷题快速掌握Python基础语法(2/4)

7-11 分段计算居民水费

问题描述:
为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。

输入格式:
输入在一行中给出非负实数x

输出格式:
在一行输出应交的水费,精确到小数点后2位。

参考代码

x=int(input())
if x<=15 :
    y=4*x/3
else :
    y=2.5*x-17.5
print("%.2f"%y)

新语法点

7-12 两个数的简单计算器

问题描述:
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。

输出格式:
当运算符为+-*/%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR

参考代码

x,op,y=input().split(' ')
x=int(x)
y=int(y)
if op=='+' :
    print(x+y)
elif op=='-' :
    print(x-y)
elif op=='*' :
    print(x*y)
elif op=='/' :
    print(int(x/y))
elif op=='%' :
    print(x%y)
else :
    print("ERROR")

新语法点

  1. 涉及负数的整数除法修正:print(int(x/y))

7-13 日K蜡烛图

问题描述:
股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。
如果CloseOpen,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。

输入格式:
输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。

输出格式:
在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow

参考代码

Open,High,Low,Close=map(float,input().split(' '))
if CloseOpen :
    print("R-Hollow",end=(''))
else :
    print("R-Cross",end=(''))
if (Lowmax(Open,Close)) :
    U=True
else :
    U=False
if L and U :
    print(" with Lower Shadow and Upper Shadow")
elif L :
    print(" with Lower Shadow")
elif U:
    print(" with Upper Shadow")

新语法点

7-14 求整数段和

问题描述:
给定两个整数AB,输出从AB的所有整数以及这些数的和。

输入格式:
输入在一行中给出2个整数AB,其中−100≤AB≤100,其间以空格分隔。

输出格式:
首先顺序输出从AB的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X

参考代码

A,B=map(int,input().split(' '))
cnt=sum=0
for i in range(A,B+1) :
    cnt+=1
    sum+=i
    print("%5d"%i,end=(''))
    if cnt==5 :
        print()
        cnt=0
if (cnt) :
    print()
print("Sum = %d"%sum)

新语法点

  1. for循环语句:for i in range(A,B+1) :
  2. 占位控制与右对齐:print("%5d"%i,end=(''))

7-15 计算圆周率

问题描述:
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。

输入格式:
输入在一行中给出小于1的阈值。

输出格式:
在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。

参考代码

l=float(input())
item=sum=t=1
while item>=l :
    item=item*t/(2*t+1)
    sum+=item
    t+=1
print("%.6f"%(sum*2))

新语法点

7-16 求符合给定条件的整数集

问题描述:
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。

输入格式:
输入在一行中给出A。

输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。

参考代码

A=int(input())
cnt=0
for i in range(A,A+4) :
    for j in range(A,A+4) :
        for k in range(A,A+4) :
            if i!=j and j!=k and k!=i :
                cnt+=1
                item=i*100+j*10+k
                print("%d"%item,end=(''))
                if cnt%6==0 :
                    print()
                else :
                    print(' ',end=(''))

新语法点

7-17 爬动的蠕虫

问题描述:
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D

输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。

参考代码

N,U,D=map(int,input().split())
time=0
while N>0 :
    if U>=N :
        time+=1
        N-=U
        break
    else :
        time+=2
        N-=U-D
print(time)
exit(0)

新语法点

7-18 二分法求多项式单根

问题描述:二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。

本题目要求编写程序,计算给定3阶多项式在给定区间[a,b]内的根。

输入格式:
输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点ab。题目保证多项式在给定区间内存在唯一单根。

输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。

参考代码

global L
L=[0,0,0,0]
def f(x) :
    return L[0]+x*(L[1]+x*(L[2]+x*L[3]))
L[3],L[2],L[1],L[0]=map(float, input().split())
a,b=map(float,input().split())
l=a;r=b
while r-l>0.0001 :
    fl=f(l)
    fr=f(r)
    if fl==0 :
        r=l
        break
    elif fr==0 :
        l=r
        break
    if fl*fr<0 :
        mid=(r+l)/2
        fm=f(mid)
        if fm==0 :
            l=r=mid
            break
        elif fm*fl<0 :
            r=mid
        else :
            l=mid
print("%.2f"%l)

新语法点

  1. 全局变量:global L
  2. 列表(list)数据类型:L=[0,0,0,0]
  3. 自定义函数:def f(x) :

7-19 支票面额

问题描述:
一个采购员去银行兑换一张yf分的支票,结果出纳员错给了fy分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:
输入在一行中给出小于100的正整数n

输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution

参考代码

n=int(input())
y=f=-1
for i in range(0,100) :
    if (199*i+n)%98==0 :
        y=i
        f=(199*y+n)//98
        break
if y==-1 or f>=100:
    print("No Solution")
else :
    print("%d.%d"%(y,f))

新语法点

7-20 打印九九口诀表

问题描述:下面是一个完整的下三角九九口诀表:

1*1=1   
1*2=2   2*2=4   
1*3=3   2*3=6   3*3=9   
1*4=4   2*4=8   3*4=12  4*4=16  
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81   

本题要求对任意给定的一位正整数N,输出从1*1N*N的部分口诀表。

输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

参考代码

n=int(input())
for i in range(1,n+1) :
    for j in range(1,i+1) :
        print("%d*%d=%-4d"%(j,i,i*j),end=(''))
    print()

新语法点

  1. 占位控制与左对齐:print("%d*%d=%-4d"%(j,i,i*j),end=(''))

你可能感兴趣的:(通过PTA刷题快速掌握Python基础语法(2/4))