博客写作背景----项目中解决的问题
最近遇到一个使用stm32单片机多路采集信号的项目,还需要在上位机进行波形的查看,信号算法的处理,初步定为使用labview编写上位机程序进行处理。
下面是我最近写程序的一些知识,进行了部分的整理,发出来和大家一起分享,也方便我以后查找自己的编程过程。
编程知识点–处理算法–做题思路
拟仪器技术出现后,计算机更快速、更深入地被引入到各个测量领域中。当人们利用传感器和数据采集卡等设备将真实的物理量采集进计算机后,一般都要对这些反映被测对象的采样数据信息进行分析和处理,通常只有这样,才能从原始的数据中提取出真正关注和感兴趣的有用信息。为了实现这样的目标,相应的计算量可能是非常大的,而这些,都会随着计算机性能的逐步提高而得到解决。对采集到的原始数据进行分析和处理,就涉及算法的设计及其实现软件的编写。
著名的计算机科学家尼古拉斯•沃斯(Niklaus Wirth)曾经提出过一个公式:程序=数据结构+算法。其中,数据结构描述了程序中要指定数据的类型和数据的组织形式;而算法,则描述了解决问题的方法、步骤和过程。算法是所有程序的核心和灵魂。一般地,算法被设计用于以最小代价高效地解决特定的问题。
解决一个问题,可能有很多种不同的算法可以实现。通常,为评价算法的有效性,主要是考虑它们的资源需求——使用的时间和占用的空间
寻找既是回文数又是质数的数字。
回文数:一个数从左边读和从右边读都是同一个数,例如6886;质数:一个大于1的自然数,除了1和它本身外,不能被其他的自然数(质数)整除,换言之,就是该数除了1和它本身以外,不再有其他的因数。
请找出1~107内的既是回文数又是质数的数字,在前面板上将它们显示出来,并给出符合题目要求的这些数字的个数。具体编程要求:①不允许利用LabVIEW中的公式节点、MathScript节点等文本语言节点;②要有算法及其实现的VI编程代码,而不是直接给出答案。
算法一:拿到这个题目,最容易想到的思路就是采用轮询的做法,即先找出1~107中的回文数,然后再在这些回文数中找到是质数的数字。按轮询的思路,有几处可以改进具体算法的地方:①回文数和质数的寻找顺序,由于回文数的判断比质数要简单,所以应采取先找回文数、再找其中的质数的思路,这样,算法的计算量会更小;②在判断该数字是否是质数时,轮询的次数取到该数字的平方根大小即可。
判断回文数的算法如下:先将数值转换成字符串,得到字符串A,再将字符串A经反转字符串函数进行反转,得到字符串B,将A和B都再转换成数值a和b,然后进行比较,如果a=b,则该数即为回文数。
按照上述算法编写的VI的程序框图如图1所示,即先搜索回文数,然后再进行质数的判断。
算法一的改进版本VI的程序框图如图2所示,它与原算法一的区别在于判断回文数的具体算法。在算法一的改进版本中,首先也是将数值转换成字符串、得到字符串A,之后,将A利用反转字符串函数反转得到字符串B,然后直接将字符串A与字符串B进行比较,而未再将字符串B转换成数字,如此,运算量会有所减少。
例如,对上限为107的数字范围,如果采用轮询的方法找出所有的回文数,需要判断107个数。而实际上,其中的回文数只有9+9+90+90+900+900+9000+9000=19 998个,再考虑位数为偶数的回文数肯定不是质数的这个条件,则需要生成的回文数只有19 998/2=9999个。如此,按照生成数字的思路,所需的运算次数只是轮询方法运算次数的9999/107=0.1%,可见,其循环次数会大大减少。所以,采用“先生成回文数再判断其是否为质数”的算法,明显优于“先搜索回文数再判断其是否是质数”的算法。
在算法二中,生成回文数后,再去判断一个数是否是质数的算法部分与算法一中的相应算法部分是一致的。
至于如何生成回文数,在构造中不难发现,可以通过限定数字前半部分的数,就可确定整个回文数。但回文数有两种类别。比如用123构造回文数,可得12 321和123 321,记为A类和B类。如此,可引入阶、类两个变量对回文数进行分类,得到如下结果(黄色是构造基数),如表1所示。可以看出,对于B类,由于其位数是偶数,可以被11整除,一定不是质数,根据原命题,构造回文数时只需要构造出A类的回文数即可。