目录
一、789. 数的范围 - AcWing题库
二分法
def check_left(nums, x):
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] >= x:
r = mid - 1
else:
l = mid + 1
return l if l < n and nums[l] == x else -1
def check_right(nums, x):
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] > x:
r = mid - 1
else:
l = mid + 1
return r if r >= 0 and nums[r] == x else -1
n, q = map(int, input().split())
nums = list(map(int, input().split()))
for _ in range(q):
x = int(input())
print(check_left(nums, x), check_right(nums, x))
二、790. 数的三次方根 - AcWing题库
1.简单粗暴法
注意:负数开根号会出错
n = float(input())
if n >= 0:
ans = pow(n, 1/3)
else:
ans = -pow(-n, 1/3)
print("%.6f" % ans)
2.二分法
来自题解(AcWing 790. 数的三次方根 - AcWing)。
n = float(input())
l, r = -10000, 10000
while r - l >= 1e-7: # 精度
mid = (l + r) / 2 # 这里不能是整除,不然将会陷入死循环
if mid ** 3 >= n:
r = mid
else:
l = mid
print("%.6f" % l)
三、791. 高精度加法 - AcWing题库
1.简单粗暴法
# 简单粗暴法
x = int(input())
y = int(input())
print(x + y)
2.高精度加法
# 高精度加法
def clear(nums):
# 清除数组内容
for i in range(LEN):
nums[i] = 0
def read(nums):
# 逆向读入数据
x = input()
clear(nums)
n = len(x)
for i, c in enumerate(x):
nums[n - i - 1] = ord(c) - ord('0')
def printf(nums):
# 逆序输出
i = LEN - 1
# 去掉前置0
while i >= 0:
if nums[i] != 0:
break
i -= 1
if i == -1:
print(0)
else:
while i >= 0:
print(nums[i], end = '')
i -= 1
def add(a, b, c):
clear(c)
for i in range(LEN):
c[i] += a[i] + b[i] # 注意是加等
if c[i] >= 10:
c[i + 1] += 1
c[i] -= 10
LEN = 100005
a = [0] * LEN
b = [0] * LEN
c = [0] * LEN
read(a)
read(b)
add(a, b, c)
printf(c)
四、792. 高精度减法 - AcWing题库
def clear(nums):
for i in range(LEN):
nums[i] = 0
def read(nums):
s = input()
n = len(s)
clear(nums)
for i, c in enumerate(s):
nums[n - i - 1] = ord(c) - ord('0')
def printf(nums):
i = LEN - 1
while i >= 0:
if nums[i] != 0:
break
i -= 1
if i < 0:
print(0)
else:
while i >= 0:
print(nums[i], end = '')
i -= 1
def cmp(a, b):
# 比较大小,逆序进行比较,从高数位开始
# 很重要
for i in range(LEN - 1, -1, -1):
if a[i] != b[i]:
return a[i] > b[i]
return True
def sub(a, b, c):
clear(c)
for i in range(LEN):
c[i] += a[i] - b[i]
if c[i] < 0:
c[i + 1] -= 1
c[i] += 10
LEN = 100005
a = [0] * LEN
b = [0] * LEN
c = [0] * LEN
read(a)
read(b)
if cmp(a, b):
sub(a, b, c)
else:
sub(b, a, c)
print('-', end = '') # 输出负号
printf(c)
五、793. 高精度乘法 - AcWing题库
高精度-单精度乘法
本题题目中的乘数是低精度
# 高精度-单精度乘法
def clear(nums):
for i in range(LEN):
nums[i] = 0
def read(nums):
s = input()
n = len(s)
clear(nums)
for i, c in enumerate(s):
nums[n - i - 1] = ord(c) - ord('0')
def printf(nums):
i = LEN - 1
while i >= 0:
if nums[i] != 0:
break
i -= 1
if i < 0:
print(0)
else:
while i >= 0:
print(nums[i], end = '')
i -= 1
def mult_short(a, b):
imp = 0
for i in range(LEN):
# 原地修改
a[i] = a[i] * b + imp
imp = a[i] // 10
a[i] %= 10
LEN = 100005
a = [0] * LEN
# c = [0] * LEN # 储存答案
read(a)
b = int(input())
mult_short(a, b)
printf(a)
完
感谢你看到这里!一起加油吧!