2024.5.29刷题记录

目录

一、789. 数的范围 - AcWing题库

二分法

二、790. 数的三次方根 - AcWing题库

1.简单粗暴法

2.二分法

三、791. 高精度加法 - AcWing题库

1.简单粗暴法

2.高精度加法

四、792. 高精度减法 - AcWing题库

五、793. 高精度乘法 - AcWing题库

高精度-单精度乘法


一、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)

感谢你看到这里!一起加油吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值