华为编程面试题目 求2到2000的质数 源程序筛法求质数

2024-04-12 17:08

本文主要是介绍华为编程面试题目 求2到2000的质数 源程序筛法求质数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内存足够大,写程序输出2到2000的质数。

'''华为面试题目 求2到2000的质数'''
N = 2000
number = list( range(2, N+1) )
times = 0
checknum = list(range(2,int((N+1)/2)+1))
for i in checknum:for index in number:times += 1if index != i:if index/i == int(index/i):number.remove(index)if index in checknum:checknum.remove(index)print(number)
print("尝试%d次"%times)

以上比较朴素、比较笨、比较快速的实现了一个程序。如果作为本科生,写出这样的程序或可以接受。

设计思想:

验证一个大于2的数是不是质数,当然只要从2循环到int(N/2),去除这个数,如果能够整除,被除数不等于除数,则这就是一个合数。如果都不能整除,则这是一个质数。

但是如果从2一直到N,都这样求一遍,时间复杂度太高了。比如,计算49是不是质数,前面会使用4和6去除,问题是4和6本身就是合数,其实应该使用质数去除49验证,也就是用2 3 5 7,但是,怎么直接拿这种质数去除呢?那么以上程序的朴素思想1就来了:维护两个表,一个表number是从2到N,一个表checknum是从2到N/2,checknum专门存储除数。每一次取除数都从checknum取,一旦checknum能够整除number,判断出这个number是一个合数,就把它从两个表里面删去。由于我们使用的是python的for in 形式的循环,动态修改循环列表,可以保证目前用于检查的数是个质数,不会从未来的表里删掉。比如我们验证4/2,则4应该从checknum表里面删掉;而不会因为验证一个m,导致了小于m的数从number被删掉,这样的话,不会需要回溯数组。于是就有了以上程序。

当然这个程序并不是某一种最优解,需要考虑优化解法。

 

有一种获取一个范围内的质数的方案叫“筛法”,就是把这个范围内的数都写出来,用最小的质数2来除,除尽就划掉。再用下一个质数3来除,除尽就划掉。那么利用这种思想,我们可以有第2种程序:

从list里面取除数,从2开始,一个个循环去除list包含的元素,查找list中的合数,找到合数就从list删掉(当然你要考虑到,list的查找+删除remove函数由于做了大量的数据位移,实际是很耗时的),然后,list的下一个数:3。当3筛过之后,由于4已经在除以2的一轮中删掉了,所以下一个除数是5。这就避免了使用合数来除list中的数。

另外,用2到N/2中所有的质数来除吗?也不是。显然,实际应该从2到int(sqrt(N))来除。比如,N=100,由于除以7的时候,7*14=98已经被删除,在这之前的7*11=77也被删除了,已经不需要使用int(sqrt(100))+1=11除了,11*8 11*9 都在更早被删除,所以只要小于等于10,就可以了。为什么要等于?比如N=121,int(sqrt(N))=11,需要除到11时才能把121去掉。

那么我们就有了下面的解法:

'''华为面试题目 求2到2000的质数'''
import math
N = 2000
number = list( range(2, N+1) )
times = 0
index = 0 #index表示现在的除数是list里的第几个数
#flag定为N的算术平方根
flag = int(math.sqrt(N))
for i in number:x = number[index]#x 从number中取数,如果大于flag本轮循环结束if x > flag:break#从index+1开始向后遍历,如果能够整除则从number删除for bei in number[index+1:]:times += 1if bei/x == int(bei/x):number.remove(bei)index += 1
#最终剩下的就是质数
print(number)
print("尝试%d次"%times)

这个解法还有没有改进空间呢?还是有的。在for bei in  number[index+1:]这里,这是做了一个列表的切片。每做一个切片就是复制数组的一段,还是有比较大的开销。那么,我们如果把这个循环换成:自index+1到len(number)循环,取number变量的事情放在里面,则会省去一些数组复制的空间开销。

但是,一旦这样处理,删除、取变量都是同一个数组操作,要注意控制里面的循环变量。

这篇关于华为编程面试题目 求2到2000的质数 源程序筛法求质数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897730

相关文章

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

C++面试八股文:std::deque用过吗?

100编程书屋_孔夫子旧书网 某日二师兄参加XXX科技公司的C++工程师开发岗位第26面: 面试官:deque用过吗? 二师兄:说实话,很少用,基本没用过。 面试官:为什么? 二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用vector,需要随机插入和删除的时候可以使用list。 面试官:那你知道STL中的stack是如何实现的吗? 二师兄:默认情况下,stack使

华为---OSPF的DR与BDR(六)

9.6 OSPF的DR与BDR 9.6.1 原理概述 在OSPF的广播类型网络和NBMA类型网络中,如果网络中有n台路由器,若任意两台路由器之间都要建立邻接关系,则需要建立n×(n-1)/2个邻接关系,即当路由器很多时,则需要建立和维护的邻接关系就很多,两两之间需要发送的报文也就很多,这会造成很多内容重复的报文在网络中传递,浪费了设备的带宽资源。因此在广播和NBMA类型网络中,OSPF协议定义

Java面试八股之JVM参数-XX:+UseCompressedOops的作用

JVM参数-XX:+UseCompressedOops的作用 JVM参数-XX:+UseCompressedOops的作用是启用对象指针压缩(Ordinary Object Pointers compression)。这一特性主要应用于64位的Java虚拟机中,目的是为了减少内存使用。在传统的64位系统中,对象引用(即指针)通常占用8字节(64位),而大部分应用程序实际上并不需要如此大的地址空间

LeetCode--204 计数质数

题目 统计所有小于非负整数 n 的质数的数量。 示例 示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 class Solution {public:int countPrimes(int n) {if (n <= 2) return 0;int cnt = 0;vector<bool> isPrime(n, true);

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了,难不成是被华为淘汰的?在华为混不下去了吧?身体没啥毛病吧,我们这体检可是很严的。” 近日,一位华为员工在朋友圈爆料,自己在面试时遭到了面试官的无理取闹和人身攻击,原因仅仅是因为他35岁了,曾经在华为工作过。 这番话,充满了傲慢与偏见,让人听了义愤填膺。这位面试官的言行,不仅是对求职者的不尊重,更是对职场规则的践踏。 面试本应是双向选择的过程,企业和求职者在相互了解的基

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt