数组(2)数组运算及典例(求解素数的方法)

<1>数组运算

1)数组的集成初始化

1.形式示例

1 - int a\[\]={1,2,3...};

2 - int a13={2};------------第一个单元内中的a0=2,剩下的单元都默认赋为0

2.集成初始化时的定位------仅适用于C99

举例:

int a10={ 0=2,2=3,6, };

特点:
  1. n在初始化数据中给出定位;
  2. 没有定位的数据接在前一个单元之后;
  3. 其余位置补0;
  4. 也可以不给出数组大小让编译器算;

2)数组的大小

------------sizeof给出整个数组所占据的内容的大小,单位是字节

用sizeof数组除以sizeof数组的第一个单元,就得到数组的元素个数

------sizeof(a)/sizeof (a0)

  • 这样的代码,即使数组中的初始数据被修改,也不需要
    修改遍历代码

3)数组的赋值

示例:

int a\[\]={1,2,3,4...};

int b\[\]=a;

判断:

------------判断这串代码是否可以实现将a的数组赋给b的数组

结果及原因

1.结果: 数组不能实现将一个数组变量赋给另一个数组变量;

2.**原因:**要实现将一个数组的所有元素交给另一个数组,必须通过遍历;

  • 示例:
    for(i=0;i<length;i++){
    bi=ai;
    }

4)补充:遍历数组

1.一般形式

通常使用for循环,让循环变量i从0到小于数组的长度,这样循环体内最大的i正好是数组最大的有效下标
*

2.常见错误:

1-循环结束条件为<=数组长度;
2-离开循环后,继续用i的值来做数组元素的下标;------------正好是数组无效的下标
*

3.数组作为函数参数时,必须再使用另外一个参数来传入数组的大小

注意:

  1. 当数组作为函数参数时,不能在\[\]中给出数组的大小;
  2. 同时也不能再利用sizeof来计算数组的元素个数;

<2>数组典例:素数

求解素数的几种方法

(1)调用函数

int isprime(int x);

int main(void){

int x;

scanf("%d",&x);

if(isprime(x)){

printf("%d是素数\n",x);

}else{

printf("%d不是素数\n",x);

}

}return 0;

(2)从2到x-1测试是否可以整除

int isprime(int x){

int ret=1;

int i;

if(x= =1) ret = 0;

for(i=2;i<x;i++){

if(x%i==0){

ret=0;

break;

}

}

return ret;

}

对于n要循环n-1遍;
当n足够大时,就是n遍;

(3)去掉偶数后,从3开始到x-1,每次加2

int isprime(int x){

int ret=1;

int i;

if(x= =1||(x%2==0&&x!=2))

ret=0;

for(i=3;i<x;i+=2){

if(x%i= =0){

ret=0;

break;

}

}

return ret;

}

当n很大时循环次数为n/2次

(4)对(3)进行进一步修改,无需达到x-1次,使用sqrt(x)

int isprime(int x){

int ret=1;

int i;

if(x= =1||(x%2==0&&x!=2))

ret=0;

for(i=3;i<sqrt(x);i+=2)

if(x%i= =0){

ret=0;

break;

}

}

return ret;

}

只需循环sqrt(x)次

(5)构建素数表

int main (void){

const int number=100;//计算前一百位素数

int prime number={2};** //初始化为2**

int count=1;//已经包含了一个元素2;

int i=3;

while(count<number){

if (isprime(i,prime,count)){

primecount++=i;

//对cnt变量进行理解:

cnt变量的值为1,1对应数组下标1所在的位置,所以primecnt++=i我们是将i的值当第一次i=3写到cnt对应的位置上去;这之后在进行++操作,这时cnt便等于2,也就意味着cnt指向了数组中下标为2的位置(即分为两个操作:1:将cnt的值赋到对应位置;2:将cnt指向下一个位置)

}

i++;

}

for(i=0;i<number;i++){

printf("%d",primei);

if((i+1)%5) printf("\t");

else printf("\n");

}

return 0;

}

(6)进一步改造素数表

规则(构造n以内的素数表)

1. 令x=2;
2. 将2x,3x,4x...直至ax<n的数标记为非素数;
3. 令x成为下一个没有被标记的非素数的数,重复2的操作,直到所有数被尝试完毕;

我们举例对方法进行理解

1.数组:2,3,4,5,6,7,8,9,10,11,12,13
2.推理过程:

第一项为2,2的倍数有4,6,8,10,12,将这些数标记为非素数,此时剩下的没有被标记的非素数为3,5,7,9,11,13;

接着以3为x,3的倍数6,9,12被标记为非素数;此时剩下的没有被标记的非素数还有5,7,11,13;

以此类推......

(7)再次改造,运用伪代码

目的:构造n以内的素数表

思路:

1. 开辟primen,初始化其所有元素为1,primex为1表示x是素数;
2. 令x=2;
3. 如果x是素数,则对于(i=2;x*i<n;i++),令primei*x=0;
4. 令x++,如果x<n,重复3,否则结束

代码

#include <stdio.h>

int main(){

const int maxnumber=25;

int isprimemaxnumber;

int i;

int x;

for(i=0;i<,maxnumber;i++){

isprimei=1;//------------1.初始化所有元素为1------------
}

for(x=2;x<maxnumber;x++){

if(isprimex){

for(i=2;i*x<maxnumber;i++){
isprimei* x=0;//------------2.将所有该数的倍数标记为0,也就是标记为非素数------------
//------------3.同时再对下一个素数进行同样的操作,对小于maxnumber的数进行遍历------------

}

}

}

for(i=2;i<maxnumber;i++){

if(isprimei){

printf("%d\t",i);//------------4.将所有是素数的数,isprime仍保留为1的进行输出------------

}

}

printf("\n");

return 0;

}

相关推荐
天空'之城36 分钟前
C 语言工业级通用组件手写 08:精准软件消抖
c语言·嵌入式开发·工业级组件·软件消抖·按键防抖
Legendary_0082 小时前
LDR6500 设计指南:Type-C 音频快充二合一配件 PD 取电与插拔时序控制方案
c语言·开发语言·音视频
会飞的小新3 小时前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
爱刷碗的苏泓舒4 小时前
C 语言 if-else 与 switch-case 分支语句对比
c语言·开发语言
无相求码4 小时前
指针的5层境界,从入门到劝退:C语言指针进阶全解析
c语言
C++ 老炮儿的技术栈5 小时前
基于MFC+原生GDI手动自绘仪表盘控件
c语言·c++·visual studio·控件·工业控制·gdi·自绘
小肝一下5 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
炸膛坦客14 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
程序员Rock1 天前
上位机开发-MODBUS面试常见问题
c语言·c++·面试·职场和发展·上位机
blevoice1 天前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机