python 练习

一. PTA习题

1001 害死人不偿命的(3n+1)猜想

卡拉兹(Callatz)猜想

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式

输出从 n 计算到 1 需要的步数。

输入样例:

3

输出样例:

5

代码实现:

def even(num):
    num = num / 2
    return num


def odd(num):
    num = (3 * num + 1) / 2 
    return num


step = 0
n = int(input())
m = n
while n != 1:
    if n % 2 == 0:
        n = even(n)
        step += 1
    else:
        n = odd(n)
        step += 1
print(step)

1002 写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 
10 ** 100。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间
有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

代码实现:

# 数字转汉语拼音
# 数字转汉语拼音
def tran(num):
    if num == 0:
        str = 'ling'
        return str
    elif num == 1:
        str = 'yi'
        return str
    elif num == 2:
        str = 'er'
        return str
    elif num == 3:
        str = 'san'
        return str
    elif num == 4:
        str = 'si'
        return str
    elif num == 5:
        str = 'wu'
        return str
    elif num == 6:
        str = 'liu'
        return str
    elif num == 7:
        str = 'qi'
        return str
    elif num == 8:
        str = 'ba'
        return str
    elif num == 9:
        str = 'jiu'
        return str


n = input()
k = 0  # 记录循环次数
outputStr = ''  # 创建字符串
sum = 0  # 记录各数字之和
num = 0  # 读取 sum 每一位数字

# 计算输入数字之和
for i in n:
    sum = sum + int(i)
    
# 数字转字母
for j in str(sum):
    k = k + 1
    print(k)
    num = int(j)
    outputStr += tran(num)
    if(k != len(str(sum))):
        outputStr += ' '

print(outputStr[:])

  • 难点:
    • 将数字转换成字符串时,一行中最后一个拼音数字后没有空格
  • 解决:
    • 通过定义一个outputStr = ''字符串,保存转换的字符+空格,添加变量k记录录入字符数目,当k!=len(str(sum))outputStr += ' ',以此来添加空格,不满足判断时,退出!

二.课后作业

1.星座转换

输入生日(年-月-日),转换为对应的星座

输入样例:

12-2

输出样例:

射手座

代码:

def get_xz(month, date):
    days = (20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22)
    xz = ("摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座")
    if date < days[month - 1]:
        print(xz[month - 1])
    else:
        print(xz[month])


month, date = map(int, input("请输入(月-日):").split('-'))
try:
    get_xz(month, date)
except IndexError:
    print("请输入正确的日期格式!")

2.年月日转天数

输入样例:

2019-10-1

输出样例:

2019年非闰年,2019-10-1在2019年的第274天

代码:

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


def dates(year, month, day):
    sumDays = 0
    leapYearDays = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    leapYear(year)
    if not leapYear(year):
        leapYearDays[2] = 28

    for m in range(month):
        sumDays += leapYearDays[m]
    sumDays = sumDays + day
    return sumDays


# year = int(input("请输入年份:"))
year, month, day = map(int, input("请输入(年-月-日):").split('-'))
Dates = dates(year, month, day)
if leapYear(year):
    print("%d年是闰年,%d-%d-%d在%d年的第%d天" % (year, year, month, day, year, Dates))
elif not leapYear(year):
    print("%d年非闰年,%d-%d-%d在%d年的第%d天" % (year, year, month, day, year, Dates))

3.素数

输入样例:

请输入(2,N-1):

 2,99

输出样例:

素数: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

代码:

# 素数判断
ss = []
begin, end = map(int, input('请输入(2,N-1):').split(','))

for i in range(begin, end, 1):
    tool = True
    for j in range(begin, i, 1):
        if i % j == 0 or i % 2 == 0:
            tool = False
    if tool:
        ss.append(i)

print("素数:",ss)

4.百钱买百鸡问题

'''
题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,
用100文钱买一百只鸡, 其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。

m:母鸡  m<=33
g:公鸡  g<=20
x:小鸡  x = 100 - m -g
5*g + 3*m + x/3 == 100
g + m + x == 100
'''

m = 0  # 母鸡,m<=33
g = 0  # 公鸡,g<=20
x = 0  # 小鸡,x = 100 - m -g
for m in range(0, 33, 1):
    for g in range(0, 20, 1):
        x = 100 - m - g
        if 5 * g + 3 * m + x * (1 / 3) == 100:
            print("母鸡:%d,公鸡:%d,小鸡:%d" % (m, g, x))

5.九九乘法表(四种样式)

# 左下三角
print("左下三角")
for x in range(1, 10, 1):
    for y in range(1, x + 1, 1):
        print("%2d * %2d = %2d" % (y, x, x * y), end="  ")
    print()

# 左上三角
print("左上三角")
for x in range(1, 10, 1):
    for y in range(x, 10, 1):
        print("%2d * %2d = %2d" % (x, y, x * y), end="  ")
    print()


# 右上三角
print("右上三角")
for x in range(1, 10, 1):
    for k in range(1, x):
        print(end="            ")
    for y in range(x, 10, 1):
        print("%2d * %2d = %2d" % (x, y, x * y), end="")
    print("")

# 右下三角
print("右下三角")
for x in range(1, 10, 1):
    for k in range(1, 10 - x):
        print(end="            ")
    for y in range(1, x + 1, 1):
        print("%2d * %2d = %2d" % (y, x, x * y), end="")
    print()

6.7或11整除

'''
求出1到100能被7或11整除,却不能被7和11同时整除的数,并将它们输出,每行输出10个
'''

count = 0
for i in range(1, 101):
    if ((i % 7 == 0) and (i % 11 != 0)) or ((i % 7 != 0) and (i % 11 == 0)):
        print(i, end="  ")
        count += 1
        if count % 10 == 0:
            print("")

7.周长判断三角形

'''
从屏幕读入一个数字作为三角形的周长,输出所有边长为整数的三角形。
(假设周长为I,每条边为x,y,z,x+y+z=I,
组成三角形的条件是任意两边大于第三边)
'''
I = int(input("请输入三角形的周长:"))
for x in range(1, I, 1):
    for y in range(1, I, 1):
        z = I - x - y
        if (x + y > z) and (x + z > y) and (y + z > x) and (x <= y <= z):
            print("三角形边长:x = %d,y = %d,z = %d" % (x, y, z))

'''
if语句添加判断语句 x<=y<=z 就可以排除重复的三角形
'''

8.数字金字塔

I = int(input("请输入最底层数字:"))
for i in range(1, I + 1, 1):
    for k in range(0, I - i):
        print(end=" ")
    for m in range(0, 2 * i - 1):
        print(i, end="")
    print()

9.求π(普通累加法)


代码:

补充中...
posted @ 2019-09-15 13:06  cloudguest  阅读(712)  评论(0编辑  收藏  举报