D18-Acwing-复习数论相关题目

今天好高效呀~希望能在吃午饭之前把数论的题目复习完【有点挑战】

872最大公约数

这个记得还是比较清楚的嘿嘿

def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)
n = int(input())
for _ in range(n):
    a,b = map(int,input().split())
    print(gcd(a,b))

866试除法判定质数

注意不要a//i+1,可能加了之后就变成了i<=(a//i + 1),也就是(i-1)*i<=a???变乱了??

def is_prime(a):
    if a==1:
        return 'No'
    i = 2
    # 注意不要a//i+1
    while i<=a//i:
        if a%i == 0:
            return 'No'
        i+=1
    return 'Yes'
n = int(input())
for _ in range(n):
    a = int(input())
    print(is_prime(a))

867分解质因子

没想到自己能够写出来,虽然是经过调试,但是还是很厉害了!先把自己的原版放在这里。
问题:
1、i<=a//i,别忘记等于号
2、要判断k是不是!=0
3、最后判断的是a>1而不是a>0,因为a>0时,最后留下的可能是1.

N = 100010


def prime(a):
    primes = []
    i = 2
    while i<=a//i:
        k = 0
        while a%i==0:
            a/=i
            k+=1
        if k!=0:
            primes.append((i,k))
        i += 1
    if a>1:
        primes.append((a,1))
    for i,k in primes:
        print(int(i),int(k))
    print()
            
    
n = int(input())
for _ in range(n):
    a = int(input())
    prime(a)

看了之前的代码,感觉思路差不多,可以学习的地方是,在前面加了一个判断,但a1时,说明已经除完了,就跳出循环,确实快了一点。但是,当a1的时候也自然会跳出循环啊,那个while的条件就不满足了。
此外,之前时直接print的,没有加入到primes数组中去。
加了一个if a==1判断的代码【区别不大】

N = 100010


def prime(a):
    primes = []
    i = 2
    while i<=a//i:
        if a==1:
            break
        k = 0
        while a%i==0:
            a/=i
            k+=1
        if k!=0:
            primes.append((i,k))
        i += 1
    if a>1:
        primes.append((a,1))
    for i,k in primes:
        print(int(i),int(k))
    print()
            
    
n = int(input())
for _ in range(n):
    a = int(input())
    prime(a)

这个感觉虽然做出来了,但是还是不是很熟悉,标黄叭。

11点啦~果然没做完
先去干饭啦!!!

2022年3月30日15:40
dp第三节看的太心累了,我要去跑个步了!!!阿阿阿!!!亚历山大,去解压!

16:30
才跑了400m就下雨了,感觉也停不下来,就回来了,看了会今天关于学习的视频。

估计室友还在睡觉,没法吃饭,写两道题,到5点叭,下去吃饭,希望西红柿可以到呀

868筛质数

线性筛法,只记得只会被最小的筛掉这一句话了

鹅鹅鹅
直接看代码叭
还是不是特别能理解,默写了好几遍哈哈哈

n = int(input())
N = 1000010
is_prime = [True]*N
def find_prime(n):
    prime=[]
    for i in range(2,1+n):
        if is_prime[i]:
            prime.append(i)
        j = 0
        while prime[j]*i<=n:
            is_prime[prime[j]*i]=False
            if i%prime[j]==0:
                break
            j+=1
    return len(prime)
print(find_prime(n))

869试除法求约数

问题不大,自己写的代码主要是最后print出现了问题,不应该除以i,而是应该除以a【j】。【但是自己的代码已经被自己删掉了】

两个改进的地方:
1、正序的可以直接print,不需要再循环一次了
2、可以用切片来表示逆序的,不需要再range和len了,改进后的代码如下:

def find(a):
    i = 1
    nums = []
    while i<=a//i:
        if a%i==0:
            nums.append(i)
            print(i,end=' ')
        i+=1
    # 用切片形式来逆序表达更好
    for j in nums[::-1]:
        if j*j==a:
            continue
        else:
            print(a//j,end=' ')
    print()
n = int(input())
for _ in range(n):
    a = int(input())
    find(a)

我要去休息、吃饭了!!!看看西红柿到了没???
刚刚好没到,估计晚上就可以拿到了!

到了哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值