【算法零基础100讲题解】第七讲 素数判定——基于Python语言

零.写在前面


💗博主简介:大家好,我是MUSE,一个正在成长的Python博主小白!
😏博客主页倒霉沙拉🥗
🔥 欢迎关注🙏点赞👍评论✉️收藏💝
💻系列介绍本系列采用Python语言解决算法零基础100讲题目,相关文章可以关注专栏!

一.基础知识

今天的内容是关于一些素数的判定的,素数的判定离不开我们所学的每一门语言,而且素数的判定也有很多种方法,在介绍素数的判定之前,我们先需要搞定素数的定义;
1.1素数的定义

只能被常数1或自己整除,不能被其他整数整除的正整数。 任何一个正整数,都能被常数1或自己整除。且1不是素数,20以内的素数有[2,3,5,7,11,13,17,19]

1.2素数判定的算法设计

def isPrime(x):
			if x==1:
				return False
			for i in range(2,int(sqrt(x))+1):
				if x%i==0:
					return 	False
			return 	True

二.题目解析

1.回文素数(866)

在这里插入图片描述

class Solution:
	def primePalindrome(self,n:int)->int:
		def isPrime(x):
			if x==1:
				return False
			for i in range(2,int(sqrt(x))+1):
				if x%i==0:
					return 	False
			return 	True
		
		def isPalindrome(x):
			x=str(x)
			left=0
			right=len(x)-1
			while left<right:
				if x[left]!=x[right]:
					return False
				left+=1
				right-=1
			return True

		while True:
			if isPrime(n) and isPalindrome(n):
				return n
			n+=1
			if 10**7<n<10**8:
				n=10**8

解题思路:

1)理解题意,需要我们返回一个比给定的数大的回文素数中最小的;
2)根据题意,拆分理解,先写一个判断素数的程序,今天的重点内容,但只是这道题目的一部分,设计判断素数的方法的时候需要留意时间复杂度。
3)再写一个判断回文数的方法,用了两个指针,分别指向头和尾,判断对应位置的字符是否相等
4)主程序,根据给定的n的值去寻找,需要注意题目中给定的10^8的范围。

2.丑数(剑指Offer 49)

在这里插入图片描述

class Solution:
	def nthUglyNumber(self,n:int)->int:
		dp=[1]*n
		a=b=c=0
		for i in range(1,n):
			n2,n3,n5=dp[a]*2,dp[b]*3,dp[c]*5
			dp[i]=min(n2,n3,n5)
			if dp[i]==n2:a+=1
			if dp[i]==n3:b+=1
			if dp[i]==n5:c+=1
		return dp[-1]

解题思路:

1)这道题目使用了动态规划的方法,理解之后还是相对容易一些的;
2)我们的目的是为了找到第n个丑数(按照从小到大的顺序排列),那么每次我们需要排的都是最小的那一个,问题是我们该如何去寻找丑数?
3)我们知道1是一个丑数,因为丑数的因子只有2,3,5,那么之后的丑数也一定只是前一个丑数乘以2,3,5得到的;
4)我们设置三个指针,开始时均指向开头,之后分别跟着对应的因子的最小值去移动,每次放入的是最小值的话就对该指针往前+1;
5)循环结束后返回列表最后一个值即可。

三.写在后面

今天的题目有两道,与素数的判定有一定的相关,但也只是其中很小的一部分,素数的判定是学习语言的必经之路,我们会不断的对其进行优化,今天的题目可以帮助大家更好的理解素数在其中的判断。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUSE_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值