数组的综合应用例子
- 格式:doc
- 大小:148.00 KB
- 文档页数:19
c语言结构体联合体数组例子摘要:一、C语言结构体1.结构体的定义与使用2.结构体数组3.结构体与函数二、C语言联合体1.联合体的定义与使用2.联合体数组3.联合体与函数三、C语言数组1.数组的定义与使用2.数组与结构体/联合体3.数组与函数四、C语言结构体、联合体、数组综合例子1.例子介绍2.代码实现3.运行结果与分析正文:一、C语言结构体结构体是C语言中一种复合数据类型,它可以将多个不同类型的数据组合在一起。
结构体的定义使用struct关键字,结构体变量的声明与普通变量相似。
结构体数组可以通过定义结构体数组变量来实现,结构体与函数的结合可以通过传递结构体指针或结构体变量实现。
二、C语言联合体联合体是C语言中一种特殊的数据类型,它允许用同一名字表示几个不同类型的变量。
联合体的定义使用union关键字,联合体变量的声明与普通变量相似。
联合体数组可以通过定义联合体数组变量来实现,联合体与函数的结合可以通过传递联合体指针或联合体变量实现。
三、C语言数组数组是C语言中一种数据类型,它用于存储一组相同类型的数据。
数组的定义使用数组关键字,数组变量的声明与普通变量相似。
数组与结构体/联合体的结合可以通过将数组作为结构体/联合体的成员来实现。
数组与函数的结合可以通过传递数组指针或数组变量实现。
四、C语言结构体、联合体、数组综合例子这里给出一个简单的综合例子,实现一个学生信息管理系统,包括学生信息的添加、查找、修改和删除功能。
通过定义结构体存储学生信息,使用数组存储学生信息,实现对学生信息的操作。
此例子充分展示了C语言结构体、联合体、数组的应用。
综上所述,C语言结构体、联合体、数组是C语言中重要的数据结构,掌握它们的使用方法和技巧对于编程工作非常有帮助。
c语言数组小案例C语言是一种广泛应用的编程语言,数组是C语言中常用的数据结构之一。
它可以存储多个相同类型的数据,并通过索引访问和操作这些数据。
下面列举了10个关于C语言数组的小案例,以帮助读者更好地理解和掌握数组的使用。
1. 计算数组元素的总和编写一个程序,从用户输入一组整数,并计算它们的总和。
使用数组来存储输入的整数,并通过循环遍历数组来计算总和。
2. 查找数组中的最大值和最小值编写一个程序,从用户输入一组整数,并找到其中的最大值和最小值。
使用数组来存储输入的整数,并通过循环遍历数组来找到最大值和最小值。
3. 数组的逆序排列编写一个程序,从用户输入一组整数,并将它们按逆序排列。
使用数组来存储输入的整数,并通过循环遍历数组来实现逆序排列。
4. 数组的去重编写一个程序,从用户输入一组整数,并去除其中的重复元素。
使用数组来存储输入的整数,并通过循环遍历数组来去除重复元素。
5. 数组的排序编写一个程序,从用户输入一组整数,并将它们按升序或降序排序。
使用数组来存储输入的整数,并通过循环遍历数组来实现排序。
6. 数组的拷贝编写一个程序,从用户输入一组整数,并将它们拷贝到另一个数组中。
使用两个数组分别存储输入的整数,并通过循环遍历数组来实现拷贝。
7. 数组的搜索编写一个程序,从用户输入一组整数,并在数组中搜索指定的值。
使用数组来存储输入的整数,并通过循环遍历数组来搜索指定的值。
8. 数组的合并编写一个程序,从用户输入两组整数,并将它们合并为一个数组。
使用两个数组分别存储输入的整数,并通过循环遍历数组来实现合并。
9. 数组的平均值和方差编写一个程序,从用户输入一组整数,并计算它们的平均值和方差。
使用数组来存储输入的整数,并通过循环遍历数组来计算平均值和方差。
10. 数组的矩阵操作编写一个程序,从用户输入一个矩阵,并实现矩阵的转置、矩阵的相加和矩阵的乘法等操作。
使用二维数组来存储输入的矩阵,并通过循环遍历数组来实现矩阵操作。
数组解决实际问题的例子
1. 学生成绩管理,学校可以使用数组来存储学生的成绩。
每个
学生的成绩可以被存储在数组的一个位置上,这样可以方便地对成
绩进行管理、检索和分析。
2. 库存管理,商店可以使用数组来跟踪他们的库存。
他们可以
创建一个包含所有产品的数组,并在每个产品的位置上存储库存数量。
这样可以帮助他们及时补充商品并避免缺货。
3. 温度记录,气象站可以使用数组来记录每小时的温度。
他们
可以创建一个包含每小时温度的数组,这样可以方便地分析温度变
化趋势。
4. 调查数据分析,调查公司可以使用数组来存储调查数据。
他
们可以创建一个数组来存储每个受访者的回答,然后使用数组方法
来分析数据,比如计算平均值、中位数等。
5. 图像处理,在图像处理中,像素通常被存储在二维数组中。
这样可以方便地对图像进行处理和修改,比如调整亮度、对比度等。
这些只是一些数组在实际问题中的应用示例,数组在各种领域都有着广泛的应用,它们提供了一种方便有效的方式来组织和管理数据。
希望这些例子可以帮助你更好地理解数组在解决实际问题中的重要性。
数组的概念与应用当今信息时代,数据处理成为了各个领域能力的核心。
而在程序设计中,数组是一种重要的数据结构,它的概念和应用广泛存在于各种编程语言中。
本文将从数组的基本概念入手,逐步介绍数组的应用场景和实际运用。
一、数组的基本概念数组是一种由相同类型的数据元素组成的有限集合,这些数据元素在内存中被顺序存储,并且可以通过索引值来访问。
数组通常被用于存储和操作一系列相关的数据,比如一组数字、一组字符串等。
在大多数编程语言中,数组都是通过下标来引用其中的元素,而数组的下标通常从0开始。
二、数组的应用场景1. 数据存储:数组通常用于存储大量数据,并且可以通过索引快速访问到每一个元素。
比如,一个学生管理系统可以使用数组来存储学生的信息,每个学生的信息都可以通过索引进行定位和操作。
2. 数据排序:排序是计算机科学中的经典问题,而数组在排序中起到了重要的作用。
通过对数组元素的比较和交换,可以实现各种排序算法,如冒泡排序、插入排序和快速排序等。
3. 数据统计:数组可以用于对一组数据进行统计分析。
比如,统计一组成绩的平均值、最大值、最小值等,都可以通过定义一个数组来存储这些数据,然后进行相应的计算。
4. 图像处理:在图像处理中,数组被广泛应用于表示和处理图像数据。
图像数据通常是一个二维数组,每个元素表示一个像素的颜色值,通过对数组的操作可以实现图像的旋转、缩放和滤波等功能。
三、数组的实际运用1. 数组的定义和初始化:在程序中使用数组,首先需要定义数组的类型和大小,然后进行初始化。
以C语言为例,定义一个包含5个整数的数组可以使用如下语句:int array[5] = {1, 2, 3, 4, 5};2. 数组的访问和操作:通过数组的索引可以访问和操作数组中的元素。
比如,对于上述定义的数组,可以使用array[2]来访问第三个元素,并可以对其进行赋值或运算。
3. 多维数组:除了一维数组外,程序中还可以使用多维数组来表示更复杂的数据结构。
中等专业学校2022-2023-2教案编号:a[i+1]=x;n++;for(i=0;i<n;i++) printf("%4d ",a[i]);}#include"stdio.h"main(){int a[20]={3,7,10,12,18,20};int x=15,i,n=6;i=n-1;while(i>=0&&a[i]>x){a[i+1]=a[i];i--;}a[i+1]=x;n++;for(i=0;i<n;i++) printf("%4d ",a[i]);}运行结果如图:例题5-6 已有一个排好序的序列,输入一个数插入到该序列中,使之仍然保持有序。
例如:将15插入到有序序列{3,7,10,12,18,20}中。
具体程序如下:#include"stdio.h"main(){int a[20]={3,7,10,12,18,20};int x=15,i,n=6;while(i>=0&&a[i]>x){a[i+1]=a[i];i--;}a[i+1]=x;n++;for(i=0;i<n;i++) printf("%4d ",a[i]);}例题5-7 编写一个程序,将字符串转置并输出。
例如:abcde----edcba程序一#include <stdio.h>#include <string.h>main(){ char s1[20],s2[20]; int n,i,j;printf("输入一串: \n"); gets(s1);n=strlen(s1);i=n-1;j=0;while(i>=0){ s2[j]=s1[i];j++; i--;}s2[j]='\0';printf("转置后的串: \n");puts(s2);}#include <stdio.h>#include <string.h>main(){ char s[20],tmp; int n,i,j; printf("输入一串: \n"); gets(s); n=strlen(s);i=0;j=n-1;while(i<j){ tmp=s[i];s[i]=s[j];s[j]=tmp;i++; j--;}printf("转置后的串: \n");puts(s); }三、小结四、作业板书设计数组的应用举例(一)1、数组举例2、转置数组程序分析教后札记中等专业学校2022-2023-2教案编号:scanf("%f",&x);if(x<3500) g=0;else if(x<5000) g=1;else if(x<8000) g=2;else if(x<125000) g=3;else if(x<38500) g=4;else if(x<58500) g=5;else if(x<83500) g=6;else g=7;printf("\n税率级数=%d\n",g);if(g>0)s=(x-3500)*RR[g-1][0]/100-RR[g-1][1];printf("个税=%2f\n,s");}程序二#include<stdio.h>main(){intRR[7][2]={{3},{10,105},{20,555},{25,1005,},{30,27 55},{35,5505},{45,13505}};intmax[7]={3500,5000,8000,12500,38500,58500,83500}; float x,s=0.0;int g;printf("输入扣除三险一金后月收入(元):\n");scanf("%f,&x");for(g=0;g<7;g++)if(x<=max[g]) break;printf("\n税率级数=%d\n",g);if(g>0)s=(x-3500)*RR[g-1][0]/100-RR[g-1][1];printf("个税=%.2f元\n",s);}拓展练习一、下面程序的功能是给一维数组 a 任意输入 6 个整数,假设为 7 4 8 9 1 5 ,然后建立一个具有以下内容的方阵并打印。
在生活中,我们经常会遇到各种各样的数组。
数组是一种数据结构,用于存储同类型的数据元素。
它可以用来表示一组元素的集合,可以是数字、字符、字符串等等。
以下是一些生活中常见的数组的例子:1.学生成绩数组:在学校中,老师会将学生的成绩记录在一个数组中。
这个数组可以用于计算学生的平均分、最高分、最低分等统计信息。
例如,一个班级的学生成绩数组可以是{90, 85, 95, 92, 88, 89, 93, 87, 96, 91}。
2.菜单数组:在餐厅中,菜单通常以数组的形式存在。
菜单数组中的每个元素代表一道菜的名称和价格。
这样,服务员可以通过遍历菜单数组来展示给客人。
例如,一个餐厅的菜单数组可以是{“糖醋排骨”, “宫保鸡丁”, “干煸豆角”, “青椒肉丝”, “红烧肉”}。
3.学生名单数组:在班级里,老师会将学生的姓名记录在一个数组中。
这个数组可以用于查找学生的信息,比如根据学生姓名查找学生的学号、性别等。
例如,一个班级的学生名单数组可以是{“张三”, “李四”, “王五”, “赵六”, “陈七”}。
4.座位安排数组:在剧院或会议室中,座位安排通常以数组的形式存在。
座位安排数组中的每个元素代表一个座位的状态,比如是否已经被占用。
这样,管理员可以通过遍历座位安排数组来查找空闲座位或者判断座位是否已经被占用。
例如,一个会议室的座位安排数组可以是{0, 1, 0, 0, 1, 1, 0, 0, 0, 1},其中0表示座位空闲,1表示座位已被占用。
通过以上的例子,我们可以看到,在生活中数组的应用非常广泛。
它可以用来存储、处理各种不同类型的数据,为我们提供了方便快捷的数据管理方式。
无论是统计学生成绩、记录菜单、查找学生信息还是安排座位,数组都可以派上用场。
值得一提的是,在C语言中,数组是一种非常重要的数据结构。
它可以用来表示一组连续的内存空间,通过索引来访问每个元素。
C语言的数组索引从0开始,因此数组中的第一个元素的索引为0,第二个元素的索引为1,以此类推。
c语言数组用法举例C语言中的数组是一种存储相同类型数据元素的数据结构,它提供了一种便捷的方式来管理和访问一组数据。
以下是一些C语言数组的基本用法举例:1. 声明和初始化数组:#include <stdio.h>int main(){// 声明一个整型数组int numbers[5];// 初始化数组元素numbers[0]=1;numbers[1]=3;numbers[2]=5;numbers[3]=7;numbers[4]=9;// 或者一步到位初始化// int numbers[] = {1, 3, 5, 7, 9};// 打印数组元素for(int i =0;i <5;++i){printf("numbers[%d] = %d\n",i,numbers[i]);}return0;}2. 多维数组:#include <stdio.h>int main(){// 声明一个2x3的整型数组int matrix[2][3]={{1,2,3},{4,5,6}};// 打印数组元素for(int i =0;i <2;++i){for(int j =0;j <3;++j){printf("matrix[%d][%d] = %d\n",i,j,matrix[i][j]);}}return0;}3. 数组作为函数参数:#include <stdio.h>// 函数接受数组和数组长度作为参数void printArray(int arr[],int length){ for(int i =0;i <length;++i){printf("%d ",arr[i]);}printf("\n");}int main(){int numbers[]={1,2,3,4,5};// 调用函数并传递数组作为参数printArray(numbers,5);return0;}4. 使用数组进行简单计算:#include <stdio.h>int main(){// 声明一个整型数组int grades[]={85,90,78,92,88};int sum =0;int length =sizeof(grades)/sizeof(grades[0]);// 计算数组元素的总和for(int i =0;i <length;++i){sum +=grades[i];}// 计算平均值float average =(float)sum /length;printf("总分: %d\n",sum);printf("平均分: %.2f\n",average);return0;}5. 字符串数组:#include <stdio.h>int main(){// 声明一个存储字符串的数组char greetings[][20]={"Hello","Bonjour","Hola","你好"};// 打印数组元素for(int i =0;i <4;++i){printf("greetings[%d]: %s\n",i,greetings[i]);}return0;}这些示例涵盖了C语言数组的基本用法,包括声明、初始化、多维数组、函数参数传递以及一些简单的计算。
一维数组生活中的例子《一维数组与生活那些事儿》嘿,大家有没有想过,其实我们的生活中到处都隐藏着“一维数组”的影子呢!别不信,听我给你慢慢道来。
一维数组,简单来说就是一排数据整齐地排着队。
那这和我们生活有啥关系呢?你看看啊,咱每天去上班,从家到公司的路上那些店铺,不就是一个一维数组嘛!早餐店在第一位,接着是水果店,然后是杂货店……它们沿着街道依次排开,就像数组里的一个个元素。
就说我每天早上吧,我的上班行程就像是一个特定的一维数组。
我会先去那家固定的包子铺,它就是数组的第一个元素,然后路过报刊亭,它就成了第二个元素,这样一路到公司。
而且我发现,我对这些店铺的喜好程度就跟数组里元素的赋值一样,包子铺的赋值高,因为我超爱他家包子,而有的店铺赋值就低一些,可能我只是偶尔才会光顾。
还有啊,咱过年走亲戚,那亲戚家的顺序不也是“一维数组”嘛!大舅家、二姨家、姑妈家,每年都按这个顺序走个遍,一到过年呀,这个数组就自动在我脑袋里运行起来了。
再想想我们的社交圈子,朋友们不也是排成一排的“数组元素”嘛!那个特别能聊的朋友是第一个元素,那个超会搞笑的家伙就成了第二个。
我们和他们相处的先后顺序、频率等,都可以理解成一种数组的排列。
其实生活中的一维数组例子真的太多了。
比如我们的购物清单,上面的物品就是一个个有序的元素;我们的每日计划,从早上到晚上要做的事情也是一个特殊的一维数组。
突然感觉生活就像一个超级大的一维数组,我们每天都在按照这个数组的规则行动,是不是很有意思?有时候我会想,如果生活中的这个“一维数组”突然乱了顺序会咋样呢?比如某天上班路上,所有店铺的位置都调换了,那我肯定会懵圈,找不到我爱的包子铺啦!或者走亲戚的顺序打乱,先去了平时后面才去的那家,估计也会感觉怪怪的。
总之啊,一维数组可不是只存在于那些复杂的程序和代码里,它就在我们普普通通的生活中,给我们增添了一份独特的乐趣和规律。
下次大家再看到那些排列整齐的东西时,不妨想一想,这是不是生活中的“一维数组”在向你打招呼呢!哈哈!。
五年级数学综合应用测试题(十六)1、有数组{1,2,3,4},{2,4,6,8},{3,6,9,12},……那么第100个数组的四个数的和是()。
2、一个两位数除351,余数是21,这个两位数最小是()。
3、2008除以7的余数是()。
4、在1、2、3……499、500中,数字2在一共出现了()次。
5、甲乙丙三人到银行储蓄,如果甲给乙200元,则甲乙钱数同样多,如果乙给丙150元,丙就比乙多300元,甲和乙哪个人存款多?(),多存()元。
6、食堂有大米和面粉共351袋,如果大米增加20袋,面粉减少50袋,那么大米的袋数比面粉的袋数的3倍还多1袋,原来大米有()袋,面粉有()袋。
7、279是甲乙丙丁四个数的和,如果甲减少2,乙增加2,丙除以2,丁乘以2后,则四个数都相等,那么甲是(),乙是(),丙是(),丁是()。
8、兄弟俩比年龄,哥哥说:“当我是你今年岁数的那一年,你刚5岁。
”弟弟说:“当我长到你今年的岁数时,你就17岁了。
”哥哥今年()岁,弟弟今年()岁。
9、甲对乙说:“我的年龄是你的3倍。
”乙对甲说:“我5年后的年龄和你11年前的年龄一样。
”甲今年()岁,乙今年()岁。
10、A、B两地相距21千米,上午9时甲、乙分别从A、B两地出发,相向而行,甲到达B地后立即返回,乙到达A地后立即返回,中午12时他们第二次相遇。
此时甲走的路程比乙走的路程多9千米。
甲每小时走()千米。
11、一只汽船所带的燃料,最多用6小时,去时顺流每小时行15千米,回来是逆流每小时行12千米,这只汽船最多行出()千米就需往回开。
12、一条轮船在两码头间航行,顺水航行需4小时,逆水航行需5小时,水速是每小时5千米,这条船在静水中每小时行()千米。
13、一座铁路桥全长1200米,一列火车开过大桥需要75秒,火车开过路旁的电线杆只需15秒,那么火车全长是()米。
14、某列车通过250米长的隧道用25秒,通过210米的铁桥用23秒,该列车与另一列长320米,速度为每小时行64.8千米的火车错车时需要()秒。
数组的综合应用例子数组的综合应用为了加深对数组的理解,下面结合一些常用算法的编程来更加深入地学习和使用数组。
由于一维数组和二维数组是程序设计中最常用的数组形式,因此这里的举例均为一维和二维数组。
1.数组元素的输入和输出[例5-12] 由用户输入5个数组元素的值并把它们输出在窗体上。
Option ExplicitPrivate Sub Command1_Click()Dim a(1 To 5) As Integer, i As IntegerFor i=1 To 5a(i)=InputBox("请输入第" & Str(i) & "个元素")NextFor i=1 To 5Print "a (";i; ")="; a(i)NextEnd Sub程序运行后,单击命令按钮,执行事件过程Command1_Click。
若输入5个值10,20,30,40,50,则窗体上显示的输出结果是:a(1)=10a(2)=20a(3)=30a(4)=40a(5)=50程序中声明了一个具有5个元素的一维整型数组,分别用循环语句输入、输出数组元素的值。
在循环体内,数组元素用循环控制变量i作下标,i值的不同就表示数组元素的不同。
在程序中引用数组元素时,其下标可以使用表达式。
只要表达式的结果不超出数组定义的上界和下界范围,下标表达式就是合法的。
例如本例中,若i=2,则:a(i+1)的值为30;a(a(i+3)\10)的值为50。
下标表达式的值还可以是实数,此时VB将自动对其进行四舍五入取整。
例如:a(1+0.4)的值是10;a(2+0.5)的值30。
2.数组元素插入删除算法说明:数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删除操作后的数组还是有序的。
基本思路:首先要找到插入位置或要删除的元素,然后以此位置为基准对后续元素进行移位。
[例5-12]数组元素的插入。
把14插入到有序数列1,4,7,10,13,16,19,22,25,28中,如图5-10所示。
图5-10数组元素的插入代码如下:Private Sub Command1_Click()Dim a(10) As IntegerDim i As Integer,k As IntegerFor i = 0 To 9 '生成数组a(i) = i * 3 + 1Print a(i);Next iPrintPrint "插入14"For k = 0 To 9 '查找插入14在数组中的位置If 14 < a(k) Then Exit ForNext kFor i = 9 To k Step -1 '从最后元素开始逐个后移,腾出位置a(i + 1) = a(i)Next ia(k) = 14 '插入数14For i = 0 To 10Print a(i);Next iPrintEnd Sub[例5-13]数组元素的删除。
把有序数列1,4,7,10,13,16,19,22,25,28中元素13删除,如图5-11所示。
图5-11数组元素的删除代码如下:Dim a() as integerFor i = 1 To 10 '生成数组ReDim a(1 to i)a(i) = (i-1) * 3 + 1Print a(i);Next iPrintPrint "删除13"For k = 1 To 10 '查找13在数组中的位置If a(k) = 13 Then Exit ForNext kFor i = k + 1 To 10 '从13所在位置的下一个元素开始逐个前移a(i - 1) = a(i)Next iRedim preserve a(1 to 9)For i = 1 To 9Print a(i);Next iPrint3.求素数素数是除了1和它本身之外再不能被其他数整除的自然数。
由于找不到一个通项公式来表示所有的素数,所以对于数学家来说,素数一直是一个未解之谜,几百年来不知吸引了世界上多少优秀的数学家。
尽管他们苦心钻研,呕心沥血,但至今仍然未见分晓。
自从有了计算机之后,人们借助于计算机的威力,已经找到了以内的所有素数。
求素数的方法有很多种,最简单的方法是根据素数的定义来求。
对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数。
但是,如果用素数定义的方法来编制计算机程序,它的效率一定是非常低的,其中有许多地方都值得改进。
1)对于一个自然数N,只要能被一个非1非自身的数整除,它就肯定不是素数,所以不必再用其他的数去除。
2)对于N来说,只需用小于N的素数去除就可以了。
例如,如果N能被15整除,实际上就能被3和5整除,如果N不能被3和5整除,那么N也决不会被15整除。
3)对于N来说,不必用从2到N-1的所有素数去除,只需用小于等于的所有素数去除就可以了。
这一点可以用反证法来证明:如果N是合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2。
如果d1和d2均大于,则有:N=d1×d2>×=N。
而这是不可能的,所以,d1和d2中必有一个小于或等于。
第二种求素数的方法是用筛法求素数。
此法称厄拉多塞筛法。
厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2~N的各数写在纸上,并在在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数是5,将它画圈,并划去5的其他倍数……,依次类推,直到所有小于或等于N的各数都画了圈或划去为止。
这时,表中画了圈的以及未划去的那些数正好就是小于N的素数。
这种方法很像一面筛子,把满足条件的数留下来,把不满足条件的数筛掉。
在计算机中,筛法可以用给数组单元置零的方法来实现。
具体来说就是:首先声明一个数组a(i),i=1,2,3,…,同时,令所有的数组元素都等于下标值,即a (i)=i,以生成1~N的自然数。
并根据以上做法,令i不是素数的元素a(i)=0(即划去该数)。
输出结果时,只要判断a(i)是否等于零即可。
筛法是计算机程序设计中常用的算法之一。
第三种方法是用6N±1法求素数。
任何一个自然数,总可以表示成为如下的形式之一:6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。
所以,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。
根据上述分析,我们可以构造另一面筛子,只对形如6 N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。
在程序上,我们可以用一个二重循环实现这一点,外循环i按3的倍数递增,内循环j为0~1的循环,则2(i+j)-1恰好就是形如6N±1的自然数。
[例5-14]用素数定义求N以内的素数。
在窗体上放置txtN和txtP两个文本框、一个标签、两个选项按钮、一个名为cmdStart的命令按钮,txtN用于N,txtP用于输出结果。
txtP的MultiLine属性设为True,Scrollbar设为Horizontal。
按钮的Click事件代码如下:Option ExplicitPrivate Sub cmdStart_Click()Dim i As Long, j As Long, k As LongDim NonP As BooleanDim PrimeNumber() As Long '存放素数k = 0ReDim PrimeNumber(0)PrimeNumber(0) = 2 '2是最小素数For i = 3 To txtNNonP = FalseFor j = 2 To Sqr(i)If i Mod j = 0 Then '判断i是否可被j整除NonP = TrueExit ForEnd IfNext jIf Not NonP Thenk = k + 1ReDim Preserve PrimeNumber(k)PrimeNumber(k) = iEnd IfNext itxtP = "" '清空显示结果文本框For i = 0 To UBound(PrimeNumber) '显示结果,每行3个If (i + 1) Mod 3 = 0 ThentxtP = txtP & PrimeNumber(i) & vbCrLfElsetxtP = txtP & PrimeNumber(i) & vbTabEnd IfNext iEnd Sub程序中vbCrLf和vbTab是VB内置常量,分别代表回车换行和Tab。
图5-12是求10000以内素数的运行结果。
图5-12定义法求素数[例5-15]用筛法求N以内的素数。
窗体设计同[例5-14],程序清单如下:Option ExplicitPrivate Sub cmdStart_Click()Dim i As Long, j As Long, k As LongDim PrimeNumber() As LongReDim PrimeNumber(1 To txtN)For i = 1 To txtN '生成1~N的自然数PrimeNumber(i) = iNext iPrimeNumber(1) = 0 '1不是素数For i = 2 To Sqr(txtN)If PrimeNumber(i) <> 0 ThenFor j = i + 1 To txtNIf PrimeNumber(j) <> 0 And j Mod i = 0 ThenPrimeNumber(j) = 0 '划去素数的倍数End IfNext jEnd IfNext itxtP = ""k = 0For i = 1 To UBound(PrimeNumber)If PrimeNumber(i) <> 0 Then '非0的是素数k = k + 1If k Mod 3 = 0 ThentxtP = txtP & PrimeNumber(i) & vbCrLfElsetxtP = txtP & PrimeNumber(i) & vbTabEnd IfEnd IfNext iEnd Sub求10000以内素数的运行结果如图5-13所示。