小白对于几个入门Python题目的思考笔记01

1、有1、2、3、4 四个数字,请打印出所有由它们组成的互不相同且不重复的三位数。
:用i,j,k分别代表百位、十位和个位,那么i,j,k的取值范围都是range(1, 5);每个位上的数字互不相同,即i != j and j != k and k != i;将i,j,k套入循环中,代码如下:

for i in range(1, 5):
    for j in range(1, 5):
        for k in range(1, 5):
            if i != j and j != k and k != i:
                print(i * 100 + j * 10 + k)

但是这样输出每行只能显示一个结果,可以用一个n来控制每行结果数目:

n = 0
for i in range(1, 5):
   for j in range(1, 5):
       for k in range(1, 5):
           if i != j and j != k and k != i:
               x = i * 100 + j * 10 + k
               n += 1
               if n%4:
                   print("%d" % x, end = ", ")
               else:
                   print(x)   

2、企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
:一个很简单的初中数学题,于是我自信满满地贴上了自己的代码:

I = float(input("请输入当月利润(万元):"))
if I <= 10:
    bonus = I * 0.1
elif 10 < I < 20:
    bonus = 10 * 0.1 + (I - 10) * 0.075
elif 20 < I < 40:
    bonus = 10 * 0.1 + 10 * 0.075 + (I - 20) * 0.05
elif 40 < I < 60:
    bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (I - 40) * 0.03
elif 60 < I < 100:
    bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (I - 60) * 0.015
elif I > 100:
    bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (I - 60) * 0.01
print("应发放奖金 %0.4f 万元" % bonus)

我还是注意到了最后输出时候的单位问题,0.4f用来保留4位小数。但是这个世界就是有那么多牛逼哄哄的大神,他们的思维就是和小白不一样啊!大神的代码:

I = float(input("请输入当月利润,单位为万元:"))
bns = 0  #初始化奖金总数
cat = [100, 60, 40, 20, 10, 0]  #金额分6档
pct = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]  #每档的提成比例
for i in range(6):
    if I > cat[i]:
        I = I - cat[i]  #注意:刨掉档位金额后,应将值重新赋给I,每一档位分开计算
        bns += I * pct[i]  #每一档位的奖金累计相加
print('当月应发放奖金总数为%0.4f万元' % bns)

高,实在是高!

3、一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?
:这要用到math里头的sqrt()取平方根。主要思路是这个数字n满足(n+100)(n+268)都能被完全开平方。除以1之后没有余数,就是一个整数。

import math
n = 0
while True:
    if math.sqrt(n + 100) % 1 == 0 and math.sqrt(n + 268) % 1 == 0:
        print(n)
    n += 1

这样的话程序不会终止,可以改一下:

import math
m = int(input("n不得超过多少?"))
n = 0
while n <= m:
    if math.sqrt(n + 100) % 1 == 0 and math.sqrt(n + 268) % 1 == 0:
        print(n)
    n += 1

4、输入某年某月某日,判断这一天是这一年的第几天?

# -*- coding: utf-8 -*-
"""
题目:输入某年某月某日,判断这一天是这一年的第几天?
"""

#规定用户输入的格式,取出对应的年月日
date = input("请按xxxx-xx-xx的格式输入日期:")
year, month, day = date.split("-")

year = int(year); month = int(month); day = int(day)

#将闰年和平年的月份天数放入列表
list_ping = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]
list_run = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]

if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
    list = list_run
else:
    list = list_ping

x = list[month - 1] + day
print("这一天是%d年的第 %d 天" % (year, x))

将经过的月份天数直接放入一个列表,然后取出来跟天数相加

5、输入三个整数 x,y,z,请把这三个数由小到大输出。

# -*- coding: utf-8 -*-
"""
题目:输入三个整数 x,y,z,请把这三个数由小到大输出。 
"""
x, y, z = input("请输入需要排序的三个数并以空格分开:").split()   
if x > y:
    temp = x
    x = y
    y = temp
if x > z:
    temp = x
    x = z
    z = temp
if y > z:
    temp = y
    y = z
    z = temp
print(x, y, z)

6、用 *号输出字母 C的图案。

print('  ****')
print('*')
print('*')
print('*')
print('  ****')

7、输出九九乘法表

# -*- coding: utf-8 -*-
"""
题目:输出九九乘法表
"""
# =============================================================================
# 我的思路是,首先输出第9行的表,那么代码就可以写成:
# for i in range(1, 10):
#     print("%d * 9 = %d" % (i, i * 9), end = '\t')
# 再输出第八行:
# for i in range(1, 9):
#     print("%d * 8 = %d" % (i, i * 8), end = '\t')
# 找到规律,将范围用j表示,外面套一个for循环,得到代码:
# =============================================================================
for j in range(2, 11):
    print("\n")
    for i in range(1, j):
        print("%d * %d = %d" % (i, (j - 1), i * (j - 1)), end = '\t')

8、斐波拉契数列
一种非常容易理解的方式:

# -*- coding: utf-8 -*-
"""
题目:输出斐波拉契数列的前n项
"""

#求斐波拉契数列的第n项
def fib(n):
    if n == 1 or n == 2:
        num = 1
    else:
        num = fib(n - 2) + fib(n - 1)   #每一项都是前面两项的和
    return num

n = int(input("需要数列的前多少项:"))
for i in range(1, n+1):
    print(fib(i))

还有个方法是不断地将两个数换位置:

# -*- coding: utf-8 -*-
"""
题目:斐波拉契数列
"""

a = 0
b = 1

n = int(input("需要斐波拉契数列前多少项"))

for i in range(1, n + 1):
    print(b)   
#==============================================================================
#   temp = a
#   a = b
#   b = temp + b
# 可以换成下面这么个简单写法:
#==============================================================================
    a, b = b, a + b    

9、判断101-200之间有多少个素数,并输出所有素数

# -*- coding: utf-8 -*-
"""
题目:判断101-200之间有多少个素数,并输出所有素数
"""

def prime(n):
    #函数的功能是判断n是否为素数,是素数返回True,否则返回False
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

n = 0        
for i in range(101, 201):
    if prime(i):
        n += 1
        print("范围内的第%d个素数是%d" %(n, i))

10、打印出所有的“水仙花数” ,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身

# -*- coding: utf-8 -*-
"""
题目:打印出所有的“水仙花数” ,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身
"""
for n in range(100, 1000):    
    g = n % 10
    s = n // 10 % 10
#==============================================================================
# 两个反斜杠“//”表示取商,三位数取商再取余数,就可以表示中间的数字
# pow(x, y)意思是求x的y次方
#==============================================================================
    b = n // 100
    if pow(g, 3) + pow(s, 3) + pow(b, 3) == n:
        print(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值