首页 > 其他分享 >数组(2)数组运算及典例(求解素数的方法)

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

时间:2023-11-28 20:58:20浏览次数:27  
标签:典例 cnt int ret 素数 数组 isprime

<1>数组运算

1)数组的集成初始化

  • 1.形式示例

1 - int a[]={1,2,3...};
2 - int a[13]={2};————第一个单元内中的a0=2,剩下的单元都默认赋为0

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

举例:

int a[10]={ [0]=2,[2]=3,6, };

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

2)数组的大小

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

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

——sizeof(a)/sizeof (a[0])

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

3)数组的赋值

  • 示例:

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

  • 判断:

————判断这串代码是否可以实现将a的数组赋给b的数组
  • 结果及原因

1.结果:数组不能实现将一个数组变量赋给另一个数组变量;
2.原因:要实现将一个数组的所有元素交给另一个数组,必须通过遍历;

  • 示例:
    for(i=0;i<length;i++){
    b[i]=a[i];
    }

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)){
prime[count++]=i;

//对cnt变量进行理解:

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

}
i++;
}
for(i=0;i<number;i++){
printf("%d",prime[i]);
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. 开辟prime[n],初始化其所有元素为1,prime[x]为1表示x是素数;
2. 令x=2;
3. 如果x是素数,则对于(i=2;xi<n;i++),令prime[ix]=0;
4. 令x++,如果x<n,重复3,否则结束

  • 代码

#include <stdio.h>

int main(){
const int maxnumber=25;
int isprime[maxnumber];
int i;
int x;
for(i=0;i<,maxnumber;i++){
isprime[i]=1;//————1.初始化所有元素为1————
}
for(x=2;x<maxnumber;x++){
if(isprime[x]){
for(i=2;ix<maxnumber;i++){
isprime[i
x]=0;//————2.将所有该数的倍数标记为0,也就是标记为非素数————
//————3.同时再对下一个素数进行同样的操作,对小于maxnumber的数进行遍历————
}
}
}
for(i=2;i<maxnumber;i++){
if(isprime[i]){
printf("%d\t",i);//————4.将所有是素数的数,isprime仍保留为1的进行输出————
}
}
printf("\n");
return 0;

}

标签:典例,cnt,int,ret,素数,数组,isprime
From: https://www.cnblogs.com/QingYuY/p/17856491.html

相关文章

  • 自学day7 数组
    typora-copy-images-to:media数组一、概念对象中可以通过键值对存储多个数据,且数据的类型是没有限制的,所以通常会存储一个商品的信息或一个人的信息:varobj={goodsname:"手机",price:"5000",introduce:"手机很时尚,很漂亮!"}varperson={name:"张......
  • [LettCode] 找到数组中和为目标值的两个数
    给定一个整数数组intArr, 还有一个目标值targetValue,需要在这个数组intArr中找出和为目标值targetValue的两个整数,并返回它们的数组下标example:intArr=[2,7,11,15],target=9,显然两个值是2和7,它们的数组下标为0,1 ......
  • Java 将JSON数组转成List对象集合
     一、从对象列表中提取并组装JSON字段的数据:(工具类)publicclassJsonMsgUtils<T>{/***从对象列表中提取并组装JSON字段的数据。**@paramlogs包含对象的列表*@paramtargetClass目标对象类型,表示JSON消息的结构......
  • Vue3中 使用v-for嵌套 获取其他数组中的值作为key值 渲染数据
    <tbody><trv-for="(row,idx)inrows":key="idx"><tdv-for="(item,key)intitle":key="key">{{row[key]}}</td></tr>......
  • LeetCode-Java:80.删除有序数组中的重复项 II
    题目给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入......
  • LeetCode-Java:26.删除有序数组的重复项
    题目给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组......
  • 数字在排序数组中出现的次数--二分
    题目描述有序序列二分先对左端点进行二分再对右端点二分最后得到两个端点,直接相减+1,得到区间个数classSolution{public:intgetNumberOfK(vector<int>&nums,intk){if(nums.empty())return0;intl=0,r=nums.size()-1;while(l<r......
  • 力扣907. 子数组的最小值之和(单调栈)
    给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。由于答案可能很大,因此 返回答案模 10^9+7 。 示例1:输入:arr=[3,1,2,4]输出:17解释:子数组为[3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。最小值为3,1,2,4,1,1,2,1,1,1,和......
  • 数组作为函数参数(冒泡排序)
    往往我们在导代码的时候,会将数组作为参数传个函数,比如我们要实现一个冒泡排序:函数讲一个整形数组进行排序(主要讲算法思想)#include<stdio.h>voidbubble_sort(intarr[],intsz){inti=0;//确认冒泡函数的趟数//intsz=sizeof(arr)/sizeof(arr[0]);//注:这里不能在void函......
  • 907. 子数组的最小值之和(贡献法,单调栈,前后缀分解)
     题目不难,但是涉及到的知识点很丰富。classSolution:defsumSubarrayMins(self,arr:List[int])->int:MOD=10**9+7n=len(arr)pre=[-1]*nsuf=[n]*nstk=[]foriinrange(n):w......