Python 经典算法练习 (2)

打印九九乘法表

使用双重 for 循环,学习 print 打印函数的使用。

In [1]:
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}X{i}={i*j}", end="\t")
    print()
1X1=1	
1X2=2	2X2=4	
1X3=3	2X3=6	3X3=9	
1X4=4	2X4=8	3X4=12	4X4=16	
1X5=5	2X5=10	3X5=15	4X5=20	5X5=25	
1X6=6	2X6=12	3X6=18	4X6=24	5X6=30	6X6=36	
1X7=7	2X7=14	3X7=21	4X7=28	5X7=35	6X7=42	7X7=49	
1X8=8	2X8=16	3X8=24	4X8=32	5X8=40	6X8=48	7X8=56	8X8=64	
1X9=9	2X9=18	3X9=27	4X9=36	5X9=45	6X9=54	7X9=63	8X9=72	9X9=81	

打印三角形和菱形

In [2]:
def print_triangle(num):
    for i in range(1, num + 1):
        print(" " * (num - i), end="")
        print("*" * (2 * i - 1))
In [3]:
print_triangle(10)
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
In [4]:
def print_diamond(num):
    print_triangle(num)
    for i in range(num - 1, 0, -1):
        print(" " * (num - i), end="")
        print("*" * (2 * i - 1))
In [5]:
print_diamond(7)
      *
     ***
    *****
   *******
  *********
 ***********
*************
 ***********
  *********
   *******
    *****
     ***
      *

完数

一个数如果恰好等于它的因数之和,这个数就称为“完数”,例如 6=1+2+3。

In [6]:
def is_perfect_number(num):
    sum = 1
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            sum += i
            sum += num / i
    return sum == num
In [7]:
perfect_numbers = [num for num in range(2, 101) if is_perfect_number(num)]
print(f"100 以内的所有完数:{perfect_numbers}")
100 以内的所有完数:[6, 28]

阶乘

自然数 n 的阶乘 n!,是指 1, 2, …, n 这 n 个数的连乘积。

In [8]:
def factorial(num):
    a = 1
    for i in range(2, num + 1):
        a *= i
    return a
In [9]:
factorial(4)
Out[9]:
24
In [10]:
import math
In [11]:
math.factorial(4)
Out[11]:
24

判断闰年

闰年的判断条件 (如下两个条件满足任意一个就是闰年):

  1. 能被 4 整除,且不能被 100 整除
  2. 能被 400 整除
In [12]:
def is_leap_year(year):
    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
        return True
    else:
        return False
In [13]:
is_leap_year(2000)
Out[13]:
True
In [14]:
is_leap_year(2100)
Out[14]:
False
In [15]:
is_leap_year(2104)
Out[15]:
True

今天是一年中的第几天

判断一个日期是该年份中的第几天。

In [16]:
def count_day(year, month, day):
    day_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if is_leap_year(year):
        day_list[1] = 29
    return sum(day_list[0 : month - 1]) + day
In [17]:
count_day(2024, 3, 1)
Out[17]:
61

乘法原理

用 0、1、2、3、4 这五个数字,能组成多少个互不相同且无重复数字的三位数,并输出这些三位数。简单分析一下,百位上可以是 1、2、3、4 这四种可能;十位上,除去百位上已用的数字,还有四种可能;个位上,还有三种可能。根据乘法原理,一共有 种情况。

In [18]:
import itertools
In [19]:
nums = []
for x, y, z in itertools.product(range(1, 5), range(5), range(5)):
    if x != y and x != z and y != z:
        nums.append(100 * x + 10 * y + z)
print(nums)
[102, 103, 104, 120, 123, 124, 130, 132, 134, 140, 142, 143, 201, 203, 204, 210, 213, 214, 230, 231, 234, 240, 241, 243, 301, 302, 304, 310, 312, 314, 320, 321, 324, 340, 341, 342, 401, 402, 403, 410, 412, 413, 420, 421, 423, 430, 431, 432]
In [20]:
len(nums)
Out[20]:
48

相关推荐