数据结构与算法之 leetcode 数学题 大数运算 / 素数判断 解题模板

数据结构与算法阿木 发布于 5 天前 2 次阅读


摘要:

在LeetCode等编程竞赛平台中,数学题是常见的题型之一。这类题目往往涉及到大数运算和素数判断等数学概念。本文将围绕这两个主题,介绍一些常用的解题模板和算法,帮助读者在LeetCode等平台上更好地解决数学题。

一、

数学题在编程竞赛中占据着重要的地位,它们不仅考察了选手的数学知识,还考验了算法和数据结构的运用能力。大数运算和素数判断是数学题中的常见题型,下面我们将分别介绍这两种题型的解题模板和算法。

二、大数运算

1. 大数加法

在Python中,可以使用字符串来表示大数,然后按照从低位到高位的顺序进行逐位相加,并处理进位。

python

def add_big_numbers(num1, num2):


将字符串翻转,方便从低位到高位相加


num1, num2 = num1[::-1], num2[::-1]


max_len = max(len(num1), len(num2))


carry = 0


result = []

for i in range(max_len):


digit1 = int(num1[i]) if i < len(num1) else 0


digit2 = int(num2[i]) if i < len(num2) else 0


total = digit1 + digit2 + carry


carry = total // 10


result.append(total % 10)

如果最后还有进位,需要添加到结果中


if carry:


result.append(carry)

将结果翻转回正常顺序


return ''.join(map(str, result[::-1]))


2. 大数乘法

大数乘法可以使用长乘法算法,类似于小学时的乘法运算。

python

def multiply_big_numbers(num1, num2):


num1, num2 = num1[::-1], num2[::-1]


result = [0] (len(num1) + len(num2))


for i in range(len(num1)):


for j in range(len(num2)):


result[i + j] += int(num1[i]) int(num2[j])


result[i + j + 1] += result[i + j] // 10


result[i + j] %= 10

移除前导0


while len(result) > 1 and result[0] == 0:


result.pop(0)

return ''.join(map(str, result[::-1]))


3. 大数除法

大数除法可以使用长除法算法,类似于小学时的除法运算。

python

def divide_big_numbers(dividend, divisor):


num1, num2 = dividend[::-1], divisor[::-1]


result = []


remainder = 0

for digit in num1:


remainder = remainder 10 + int(digit)


result.append(remainder // int(num2[0]))


remainder %= int(num2)

return ''.join(map(str, result[::-1]))


三、素数判断

1. 基本素数判断

可以使用试除法来判断一个数是否为素数。

python

def is_prime(n):


if n <= 1:


return False


if n <= 3:


return True


if n % 2 == 0 or n % 3 == 0:


return False


i = 5


while i i <= n:


if n % i == 0 or n % (i + 2) == 0:


return False


i += 6


return True


2. 辗转相除法(欧几里得算法)

辗转相除法可以用来求两个数的最大公约数(GCD),同时可以用来判断一个数是否为素数。

python

def gcd(a, b):


while b:


a, b = b, a % b


return a

def is_prime_gcd(n):


if n <= 1:


return False


if n <= 3:


return True


if n % 2 == 0 or n % 3 == 0:


return False


return gcd(n, 2) == 1 and gcd(n, 3) == 1


四、总结

本文介绍了大数运算和素数判断的解题模板和算法。在实际编程竞赛中,熟练掌握这些模板和算法对于解决数学题至关重要。通过不断练习和总结,相信读者能够在LeetCode等平台上取得更好的成绩。

(注:本文约3000字,实际字数可能因排版和格式调整而有所变化。)