Python真题案例之小学算术
阶乘精确值
需求:输入一个整数n,输出n的阶乘精确值。
示例:
输入:5
输出:120
解析:
$n!$ 即 $n(n-1)(n-2)...2*1$,可以使用循环的方式计算出阶乘。由于阶乘的结果往往非常大,需要使用高精度计算库decimal
来实现。
import decimal
def factorial(n):
if n==0:
return 1
else:
return n*factorial(n-1)
def factorial_decimal(n):
if n==0:
return 1
else:
return n*factorial_decimal(n-1)
decimal.getcontext().prec = 100
n = int(input())
result = factorial(n)
result_decimal = decimal.Decimal(factorial_decimal(n))
print(result)
print(result_decimal)
孪生素数
需求:找出1-1000之间的所有孪生素数。
示例:
输出:
(3, 5)
(5, 7)
(11, 13)
(17, 19)
(29, 31)
(41, 43)
(59, 61)
(71, 73)
(101, 103)
(107, 109)
(137, 139)
(149, 151)
(179, 181)
(191, 193)
(197, 199)
(227, 229)
(239, 241)
(269, 271)
(281, 283)
(311, 313)
(347, 349)
(419, 421)
(431, 433)
(461, 463)
(521, 523)
(569, 571)
(599, 601)
(617, 619)
(641, 643)
(659, 661)
(809, 811)
(821, 823)
(827, 829)
(857, 859)
(881, 883)
解析:
孪生素数是相邻两个素数的差为2的素数对,可以通过判断相邻的两个数是否都为素数来实现。使用is_prime
函数判断一个数是否为素数。由于算法的时间复杂度比较高,需要使用筛法来优化。
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n**0.5)+1):
if n%i == 0:
return False
return True
def prime_twins():
primes = [True] * 1000
primes[0], primes[1] = False, False
for i in range(2, int(1000**0.5)+1):
if primes[i]:
for j in range(i*i, 1000, i):
primes[j] = False
for i in range(2, 979):
if primes[i] and primes[i+2]:
print((i, i+2))
prime_twins()
6174问题详解
需求:输入一个四位数,求经历过多少次“升序排列”和“降序排列”后最终得到的差为6174。(在每次排列时,如果排列后的数字不足4位,则在左边补0)
示例:
输入:3895
输出:3
解析:
我们可以根据6174的特点,即无论如何排列四位数,最多需要七次操作即可得到6174的结果,推论出每次操作都会使结果的差值缩小到原来的1/9,最终缩小到6174。因此我们可以通过模拟每次操作的过程,统计操作的次数。
def sort_num(n):
nums = [int(digit) for digit in str(n)]
nums.sort()
return nums
def reverse_num(n):
nums = [int(digit) for digit in str(n)]
nums.sort(reverse=True)
return nums
def get_difference(n1, n2):
return int(''.join([str(digit) for digit in n1])) - int(''.join([str(digit) for digit in n2]))
def k6134(num):
count = 0
while True:
nums1 = sort_num(num)
nums2 = reverse_num(num)
diff = get_difference(nums2, nums1)
if diff == 6174:
return count
count += 1
num = diff
return count
n = int(input())
print(k6134(n))
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python真题案例之小学算术 阶乘精确值 孪生素数 6174问题详解 - Python技术站