吉首大学大数据应用开发语言实验二PTA

每天更新10道题

7-1 人民币与美元汇率兑换程序

a=input()
fuhao=a[:1:]
str=a[1::]
num=int(str,10)
if fuhao=='$':
    #*7
    num=num*7
    print("¥{:.2f}".format(num))
elif fuhao=='¥':
    num=num/7
    print("${:.2f}".format(num))
else:
    print("输入格式错误")



 把符号和数字分开储存,然后判断符号运算获取换算后的货币符号以及数值

7-2 直角三角形面积

import math
num=eval(input())

for i in range(num):
    a,b,c=map(int,input().split())
    Cos_A=(b*b+c*c-a*a)/(2*b*c)
    S=(b*c*math.sqrt(1.0-Cos_A*Cos_A))/2
    print("{:.0f}".format(S))

 用三角形面积公式:

S=\frac{1}{2}sinAbc

7-3 电费

import math
num=eval(input())

for i in range(num):
    sum=0.0
    x=eval(input())
    if x>=401:
        sum+=(x-400)*0.5663
        x=400
    if x>=151:
        sum += (x - 150) * 0.4663
        x=150
    if x>0:
        sum+=x*0.4463

    print("{:.2f}".format(sum))

自上到下来写,代替switch语句 

7-4 sdut-sel-2 汽车超速罚款(选择结构)

a,b=map(int,input().split())

if b<=a:
    print("Congratulations, you are within the speed limit!")
else:
    if b-a>30:
        num=500
    elif b-a>20:
        num=270
    else:
        num=100

    print("You are speeding and your fine is {}.".format(num))

使用map来转换列表数值类型、结构赋值、分割函数 

7-5 sdut-sel-10 直角坐标系象限判断


while True:
    try:
        a, b = map(int, input().split())
        if a>0:
            if b>0:
                num=1
            else:
                num=4
        else:
            if b>0:
                num=2
            else:
                num=3
        print(num)

    except:
        break

多组输入的语法 

7-6 sdut-分段计算居民水费

x=eval(input())

if x<=15:
    y=4*x/3
else:
    y=2.5*x-17.5

print("{:.2f}".format(y))

7-7 闰年 - 实验6 条件与分支 


while True:
    try:
        a=int(input(),10)
        if (a%4==0 and a%100!=0) or a%400==0:
            print("闰年")
        else:
            print("平年")

    except:
        break

7-8 印第安男孩 - 实验6 条件与分支

n=int(input(),10)

if n==0 or n==1:
    print("%d indian boy."%(n))
else:
    print("%d indian boys." % (n))

7-9 超速罚款 - 实验6 条件与分支

a=int(input(),10)
b=int(input(),10)
if a<=b:
    print("未超速")
elif (a-b)/b<=0.1:
    print("超速警告")
elif (a-b)/b<=0.2:
    print("罚款100元")
elif (a-b)/b<=0.5:
    print("罚款500元")
elif (a-b)/b<=1:
    print("罚款1000元")
else:
    print("罚款2000元")


多行数据用多个input() 

7-10 象限判定 - 实验6 条件与分支

a, b = map(float, input().split(','))
if a > 0:
    if b > 0:
        num = 1
    else:
        num = 4
else:
    if b > 0:
        num = 2
    else:
        num = 3
print("第{}象限".format(num))

7-11 骑车还是走路?

实际上这题你可以算出来在x=100m的时候两种方式时间相同,

大于这个路程单车快

小于这个路程走路快

x=eval(input())

if x>100:
    print("Bike")
elif x==100:
    print("All")
else:
    print("Walk")

7-12 虫子吃苹果

n,x,y=map(int,input().split(','))
num=y//x
if y%x!=0:
    num=num+1
print(n-num)

7-13 打印数字矩形

n=input()
num=int(n,10)

def fun(n):
    str1=""
    small=str(n)
    for i in range(n):
        if i!=0 and i!= n-1:
            str1+=" "
        else:
            str1+=small
    return str1

for i in range (num):
    str2=""
    if i!=0 and i!=num-1:
        str2 = fun(num)
    else:
        str2 = n * num
    print(str2)

我们可以发现该矩阵有两种规律

1.在第一行和最后一行全部打印数字

2.在中间行只打印两边两个数字

于是我们写一个构造中间行的矩阵函数就可以了

7-14 统计字符串中不同种类的字符个数

str1=input()

letters=0
digits=0
spaces=0
others=0

len_str=len(str1)
for i in range(len_str):
    if str1[i].isalpha()==True:
        letters+=1
    elif str1[i].isdigit()==True:
        digits+=1
    elif str1[i].isspace()==True:
        spaces+=1
    else:
        others+=1
print("letters={},digits={},spaces={},others={}".format(letters,digits,spaces,others))

学会使用字符串值类型判断函数就行了,

注意是属于字符串的函数哦!!!

7-15 正整数的奇偶性判定

a=int(input(),10)

if (a&1)==0:
    print("{}是偶数".format(a))
else:
    print("{}是奇数".format(a))

用的位运算,比取余更快

7-16 找完数(Python版)

ccccccccccccccccccccccccc

这个得重点讲一下,并不是我屎山写的长,而是我找到以前别人博客,才发现代码可以那么简洁

先贴上我的代码

#判断是否是完数的函数
def fun(num):
    sum = 0
    for i in range(num):
        if i==0 :
            continue
        else:
            if num%i==0:
                sum+=i
    if sum==num:
        return True
    #print(sum,num)
    return False

#打印函数
def printf(n):
    count=0
    print("{} =".format(n),end="")
    #打印这个完数
    #count1=0
    for i in range(n):
        if i==0:
            continue
     
        if n%i==0:
            if count!=0:
                print(" +",end="")
            print(" {}".format(i), end="")
            count += 1
        #找因子打印
    print("")#补上一个换行

#正文部分
a,b=map(int,input().split())
b+=1
f=False
for i in range(a,b):
    if fun(i)==True:
        printf(i)
        f=True
        #print(i)
    else:
        continue

if f==False:
    print("None")

下面是大佬的代码:

链接

#By yangbo 2020.8.06
import math #使用这个库的话,可以减少时间
flag = 0    #没有完数 的标志位
m,n = map(int,input().split())
for i in range (m,n+1):     #[m,n]闭区间内
    s = [1] #
    if i % 2 == 0:#观察完数,我们会发现:完数都是偶数。这行代码对大数据可以缩短1/3的时间
        for j in range (2,int(math.sqrt(i) +1)):#   int(i**0.5 +1)
            if i%j ==0: #比如i=28,j=2
                s.append(j)#因子2入选
                s.append(i//j)#除1外,因子是成对出现的,28//2 == 14 的,也是因子
 
        if sum(s) == i:#来判断,如果i所有的因子之和为i  则这个就是我们找的完数 
            s.sort()
            print ('{:d} = '.format(i),end="")
            print(' + '.join(map(str,s)))
            flag=1
        
if(flag == 0):
    print("None")

我们来看看该怎么优化自己的代码

 1.学会调用库函数

库函数的sqrt()函数会比**0.5会更快,这应该是底层原理的原因,有待以后翻开函数底层才能解决这个问题了

2.学会观察

 如果不是这位老哥,我根本就没发现完数都是偶数orz

还有,因子是成对出现,所以可以只遍历一半,然后吧另一半的因子算出来加入列表,最后拍个序就行了,wc

3.优化打包

学会利用“”.join()来打印分隔符,这个列表是python的一个很好的工具

我写的那么长的printf()函数,实际上只需要两行

这种算法题是真的666

7-17 jmu-python-判断是否构成三角形

a,b,c=map(int,input().split())

if (a+b)>c and (a+c)>b and (c+b)>a:
    print("yes")
else:
    print("no")

任意两边之和大于第三边

7-18 jmu-python-凯撒密码加密算法

str1=input()
num=int(input())
for i in str1:
    if i.isalpha()==True:
        t=ord(i)
        t+=num
        if chr(t).isalpha()==False:
            t-=26
        print(chr(t),end="")
    else:
        print(i,end="")

char---int----char

7-19 奖金计算,循环与多分支

x=eval(input())
sum=0.0
if x>1000000:
    sum+=(x-1000000)*0.01
    x=1000000
if x>600000:
    sum+=(x-600000)*0.015
    x=600000
if x>400000:
    sum+=(x-400000)*0.03
    x=400000
if x>200000:
    sum+=(x-200000)*0.05
    x=200000
if x>100000:
    sum+=(x-100000)*0.075
    x=100000
sum+=x*0.1
print("{:.2f}".format(sum))

7-20 本题要求两个给定正整数的最大公约数和最小公倍数

def gcd(x,y):
    if y==0:
        return x
    elif x>=y:
        return gcd(y,x%y)
    else:
        return gcd(x,y%x)
#没有三目运算符,只能这样写了
a=int(input())
b=int(input())

print("{} {:.0f}".format(gcd(a,b),a*b/gcd(a,b)))

7-21 企业根据利润提成发放奖金问题

x=eval(input())
sum=0.0
if x>1000000:
    sum+=(x-1000000)*0.01
    x=1000000
if x>600000:
    sum+=(x-600000)*0.015
    x=600000
if x>400000:
    sum+=(x-400000)*0.03
    x=400000
if x>200000:
    sum+=(x-200000)*0.05
    x=200000
if x>100000:
    sum+=(x-100000)*0.075
    x=100000
if x>=0:
    sum+=x*0.1
    print("{:.1f}".format(sum))
else:
    print("0")

一个很坑的点是不大于0的利润都直接打印输出0而不保留小数(题目没有说明)

7-22 JMU-Python-分段函数

import math
from math import e
x=input()
y=0
if x.isalpha():
    print("Input Error")
else:
    a=float(x)
    if a>0:
        y=math.cos(a)+pow(e,a)
    elif a<=0:
        y=0
    print("f(%.2f) = %.2f"%(a,y))

7-23 JMU-Python-分段函数

import math
x=input()
y=0
if x.isalpha():
    print("Input Error")
else:
    a=eval(x)
    if a>0:
        y=math.sqrt(a)+math.log(a,math.e)
    elif a<=0:
        y=0
    print("f(%.2f) = %.2f"%(a,y))

7-24 JMU-Python-分段函数

import math
x=eval(input())
ans=0.0
if x>3.5:
    ans=math.cos(x)+math.exp(x)
elif 0<x<=3.5:
    #ans=(math.cos(x)+x*x)/(2.5+abs(x+math.log(100,math.e)))
    ans=math.tan(x)+math.log(1+x,math.e)
else :
    ans=0
print("{:.2f}".format(ans))

7-25 JMU-Python-分段函数

import math
x=eval(input())
ans=0.0
if x>=3:
    ans=math.exp(x)+math.sqrt(x)
elif 0<x<3:
    #ans=(math.cos(x)+x*x)/(2.5+abs(x+math.log(100,math.e)))
    ans=math.sin(x)+math.log(1+x,2)
else :
    ans=-1
print("{:.2f}".format(ans))

几个大水题

值得注意的是形如log2(3)这样的对数 可以使用

math.log(3,2)

 来进行表达

7-26 昨天

time=[0,31,28,31,30,31,30,31,31,30,31,30,31]

def isrun(year):
    if (year%4==0 and year%100!=0) or year%400==0:
        return True
    return False


n=int(input())

for i in range(n):
    a,b,c=map(int,input().split('-'))
    f=isrun((a))
    if c==1:
        b -= 1
        if b==0:
            b+=12
            a-=1

        c=time[b]
        if b==2 and f==True:
            c+=1
    else:
        c=c-1
    ##########
    print("%d-%02d-%02d" % (a, b, c))

先打表,写出每个月的天数,从下标为1开始

然后对天数进行-1,然后维护日期并输出

7-27 胜者

while True:
    try:
        n=int(input(),10)
        sum1=0
        sum2=0
        for i in range(n):
            #为什么把sum放到这里pycharm不会报错???
            a,b=map(int,input().split())
            if a>b:
                sum1+=1
            elif a<b:
                sum2+=1
        if sum1 > sum2:
            print("Sg")
        elif sum1 < sum2:
            print("Gs")
        else:
            print("CONTINUE")
    except:
        break

7-28 小游戏

n = int(input(), 10)

for i in range(n):
    #a=int(input(), 10)

    a = input().split()
    t=0
    for i in a:
        t+=int(i)
    t-=int(a[0])
    # print(t)
    if (t % 3 == 0) and (t % 5 == 0) and (t % 7 == 0):
        print("YES")
    else:
        print("NO")

对于一列有两种数据信息的,python的列表不好处理  

所以我们根据题目特点对列表求和减去第一个数据,就得到了后面的求和

然后判断是否满足条件

7-29 JMU-Python-成绩判断

a,b=map(int,input().split(","))

if a<60 or b<60:
    print("不合格")
else:
    if (a+b)/2>=90:
        print("成绩优秀")
    else:
        print("通过")

7-30 成绩转换

f='E'
while True:
    try:
        a=int(input(),10)
        if a<0 or a>100:
            print("error!")
        else:
            if a<60:
                f="E"
            elif a<70:
                f="D"
            elif a<80:
                f="C"
            elif a<90:
                f="B"
            else:
                f="A"
            print(f)

    except:
        break

7-31 求某月的天数

####1##2##3##4##5##6##7##8##9##10##11##12
a1=[31,28,31,30,31,30,31,31,30,31,30,31]
a2=[31,29,31,30,31,30,31,31,30,31,30,31]
while True:
    try:
        a,b=map(int,input().split())
        if (a%4==0 and a%100!=0) or a%400==0:
            print(a2[b-1])
        else:
            print(a1[b-1])
    except:
        break

 也可以只用a1一个表

判断闰年以及是否为二月,如果是则把输出+1

7-32 找出肇事者,循环与布尔逻辑

n=eval(input())
l=pow(10,n-1)
r=pow(10,n)-1
for i in range(l,r):
    t=i//pow(10,(n-2))
    f1=t//10
    f2=t%10

    f3=i//10%10
    f4=i%10

    if (f1==f2) and ((f4%2)==1) and ((f3+f4)==5) and ((i%3)==0):
        #print("{} {} {} {} {}".format(t,f1,f2,f3,f4))
        print(i)

和韩信点兵一样,我愿称之为韩信点兵plus!!! 

7-33 把字符串中十六进制字符转换成十进制整数

def ishex(c):
    if 48<=ord(c)<=48+9 or 97<=ord(c)<=97+5:
        return True
    return False

f_fuhao=False
str1=input()
str1=str1.lower()
str2=""

for i in str1:
    if ishex(i):
        str2+=i
    if i=="-":
        f_fuhao=True

#print(str2)
if str2!="":
    ans = int(str2, 16)
    if f_fuhao == True:
        ans = -ans
    if ans != 0:
        print(ans)
    else:
        print("0")
else:
    pass

7-34 求某一范围内的水仙花数

a,b=map(int,input().split())

b+=1

for i in range(a,b):
    if i <100:
        continue
    if i>999:
        break
    t1=i//100
    t2=i//10%10
    t3=i%10
    if t1*t1*t1+t2*t2*t2+t3*t3*t3==i:
        print(i)

7-35 不按常理出牌的列表

v = list(eval(input()))
print("before:",v)

for x in range(len(v)-1,-1,-1):
    #将一个列表反向读取防止pop()根据List特性自动填补导致读取位置错误
    #这样写x代表在列表v当中的下标
    cnt = v.count(v[x])
    #计算当前元素的个数,不唯一删除掉最前面第一个
    if cnt >= 2:
        index=v.index(v[x])
        v.pop(index)
        #不唯一删除掉最前面第一个
#方法:使用倒置读取避免pop()读取的问题
print("after:",v)

7-36 jmu-python-汇率兑换

a=input()
fuhao=a[:1:]
str=a[1::]
num=int(str,10)
if fuhao=='$':
    #*7
    num=num*6
    print("R{:.2f}".format(num))
elif fuhao=='R':
    num=num/6
    print("${:.2f}".format(num))
else:
    print("输入格式错误")



7-38 jmu-python-分段函数

import math
x=eval(input())
ans=0.0
if x<3:
    ans=1.2
elif x==3:
    ans=10
else :
    ans=2*x+1
print("f({:.2f})={:.2f}".format(x,ans))

7-40 jmu-python-分段函数&数学函数

import math
x=eval(input())
ans=0.0
if abs(x)<1:
    ans=math.sqrt(2-2*x)
elif x>=1:
    ans=(math.cos(x)+x*x)/(2.5+abs(x+math.log(100,math.e)))
else :
    ans=math.exp(x)
print("f({:.3f})={:.3f}".format(x,ans))

7-41 计算表达式(*,//, %)

a,b,c=input().split()
a=int(a,10)
c=int(c,10)
if b=='*' or b==r'//' or b=='%':
    if b=='*':
        print("{0}*{1}={2}".format(a,c,a*c))
    if b==r'//':
        print(r"{}//{}={}".format(a, c, a // c))
    if b=='%':
        print(r"{}%{}={}".format(a, c, a%c))
else:
    print("Invalid operator")

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSU_曾是此间年少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值