c语⾔prime函数怎么⽤_C语⾔⼊门——第六周笔记——数组
运算
周围太安静了,安静到现在就算有⼀根针掉地上也能听到清脆的⼀声响。
我抬头看了看⼤哥,⼤哥,⽣⽓了。
——纹路
数组运算
数组运算
数组的集成初始化
int
⽅括号⾥给出数组的⼤⼩,⽽是直接在⼤括号⾥给出了数组中每⼀个变量所该取的这次对数组的赋值很上次有明显的不同,这次并没有在⽅括号
值。其实,数组的⼤⼩,我们可以让计算来帮我们数。下⾯,我们来看⼀下这样的⼀个初始化,编译器会给我们带来什么样的结果。
int
写在⼤括号⾥的内容,会依次初始化数组中的每⼀个单元。如果我们只对⼀个数组中的单元赋值,却没对别的数组单元赋值,那么剩下的数组单元会全部默认为0。(看下⾯代码和运⾏结果)
当然,我们也可以根据需要,对⼀⼤堆数组单元中的特定单元进⾏赋值,代码如下:
int
这段代码的意思就是:第⼀个单元
那么6在2后⾯当然就是赋值给
的了,其余的单元依然默认地赋值为0。
这样的赋值有点离散数学的味道~~(因为数据⽐较稀松)
但是注意了,这种写法只有C99才有效!!
还有⼀个问题:在没给数组⼤⼩的情况下,如何让编译器数出数组的⼤⼩?
我们可以⽤sizeof
sizeof给出整个数组占据的内容的⼤⼩,单位是字节
我们把sizeof⽤于代码⾥
int
52好像跟我们的数据没什么关系。我们再加⼀样东西
int
我们发现52÷4好像就是我们要的答案!!
没错,确定⼀个数组的⼤⼩,我们就是通过写⼊
sizeof
这样写有⼀个好处,就是当我们要修改数组的时候,不⽤重新再确定数组的⼤⼩了,如下⾯这段代码int
数组的赋值
上⾯这样的赋值⽅法是⼤错特错的
做遍历,也就是说,我们需要数组变量本⾝不能被赋值(原因,我们下下周说),如果想把⼀个数组的数据也交给另⼀个数组,我们需要做遍历
循环!如下⾯这个代码
做循环
for
遍历数组通常都是使⽤for循环来遍历,让循环从变量i从0到<;数组的长度,这样循环体内最⼤的i正好是数组最⼤的有效下标。
常见的错误是:
循环结束条件是<=数组长度
离开循环后,继续⽤i的值来做数组元素的下标!
⼀⼩段总结:
数组作为函数的参数时,往往必须再⽤另⼀个参数来传⼊数组的⼤⼩
数组作为函数的参数时,不能在[]中给出数组的⼤⼩;不能再利⽤sizeof来计算数组的元素个数!
为什么不能这样做的原因我们要在讲指针的位置,来说明。
数组的作⽤:提⾼程序的运⾏效率!(估计在机器学习⾥也会⽤到,因为我们需要提⾼运算效率)
数组例⼦:素数
在函数那⼀篇⽂章⾥,我们通过调⽤isPrime函数来判断素数
int
在后⾯的判断⾥,我们要循环n-1遍,这样的话就太耗时了,我们来看⽤数组怎么写
int
需要注意其中这⼀段代码
if
prime[count++]=i做了2件事,1:把i赋给了prime[count];2:通过++使cnt指向了下次i所放的位置。如图
这是⼀种常见的套路。我们⽤这样⼀个变量来表达我们在数组当中接下去要写进去的位置,写进去后,指针⼜往后移⼀位,下⼀次它要写到下⼀个位置上去。
我们很想看看这个程序运⾏过程中,这个prime的变化,这些count,i,这些变量的变化是不是如我们想象的那样。
我们可以在程序适当的地⽅加⼀些输出语句,
int
在上⾯我们平⽩⽆故的加了这样⼀对⼤括号,⽬的是为了做调试。
{
你看,这对⼤括号的好处是什么呢?在括号⾥,我可以有⾃⼰的变量i,我的这个i和外⾯的i按照我们在函数那⼀节所学的知识,它们是没有关系的。这⾥的i就是我⾃⼰的i,在定义这个i之前,我们还可以把外⾯的那个i输出。
构造素数表。
除了上⾯判断素数的⽅法外,我们还有⼀种⽅法——构造素数表
欲构造n以内的素数表
1. 令x为2
2. 将2x、3x、4x直⾄ax<n的数标记为⾮素数
3. 令x为下⼀个没有被标记为⾮素数的数,重复2;直到令所有的数都已经尝试完毕
我们先写出下⾯这个伪算法出来
1. 开辟prime[n],初始化其所有元素为1,prime[x]为1,表⽰x是素数
2. 令x=2
3. 如果x是素数,则对于(i=2;xi<n;i++)令prime[i*x]=0
4. 令x++,如果x<n,重复3,否则结束
#include
所以,算法不⼀定和⼈的思考⽅式相同。
线性搜索
搜索
在⼀个数组中到某个数的位置(或确认是否存在)
基本⽅法:遍历
#include
在这么简单的⼀个程序⾥,有这样2个细节。
1. 我们⽤了ret来代表了⼀个返回值。如果我们不⽤ret,单⽤⼀个-1代表没到,1代表到,此时就不符合我们前⾯所说的单⼀出⼝的
原则,这会使我们后期修改程序时带来很多⿇烦。⽤了ret这个变量,后期我们在修改时,只需要单看这个出⼝就⾏了,这会使我们的结构变得很清晰。
2. 假设有⼈把上⾯的代码进⾏了修改,改为了下⾯这样的代码
int
这个代码看起来似乎很“聪明”,利⽤了i和len之间的关系。但是呢,它也违背了我们的⼀个原则——⼀个变量承担了两个责任。这个变量i 既是循环遍历⽤的变量,⼜⽤来表⽰它到底没到这样的⼀个东西。
⼀专多能是不好的代码。
搜索的例⼦
在美元⾥,每⼀个硬币都是有名字的,⽐如1分对应的penny;5分对应的nickel;10分对应的dime;25分对应的quarter;50分对应的half-dollar;
有⼀个数字对应有⼀个英⽂单词。如果我们来写⼀个程序,来做⼀个搜索,你输⼊⼀个数字,程序要给出所对应的英⽂单词。在数据结构⾥⾯,有⼀种散列表(hash table)。⽤hash表很适合来做这个事情。我们⽤数字来作为⼀个Key,然后存到hash表⾥去,对应的value,就是我们要的答案。
#include数组全部赋值为1
上⾯的代码⽤了两组数组,其实这并不好。在将来我们会有些不满意,因为它是割裂的两个数组。这两个割裂的数组会带来什么问题呢?在未来,也许我们会遇到⼀种叫“cache”的东西。这样的⼀种结构,对于cache来说是不友好的(⾄于为什么不友好,我也想在未来的某天会在某些书⾥某些知识点遇
到)。那么更好的做法是什么呢?
#include
这种做法,把值(数字)和字符串(名字)放到了⼀起。这种做法是对cache的⼀种更友好的做法。
⼆分搜索
线性搜索最⼤的问题是效率的问题,因为他需要把⼤部分数组⾛⼀遍。如果你有⼏百万个数据,有可能就需要搜半天。现在有另⼀种⽅法,假设某⼀个数组是排好序的,⽐如从⼩到⼤,在排好序的前提下,我们有另⼀种快速搜索的⽅案:规定最左边的数组下标为left,最右边的数组下标为right,让mid=(left+right)/2,如果数组下标为mid的数⼤于我们要的数,此时则让right=mid-1,left还为原来的值;反之,如果数组下标为mid的数⼩于我们要的数,我们就让left=mid+1,right不变。这样⼀来就能在线性搜索的基础上提⾼不少效率。
来看下⾯的代码
#include

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。