七.数组运算

最简单的搜索
在一组给定的数据中,如何找出某个数据是否存在?

int search(int key;int a[],int lenth);

int main(void)
{
	int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32};
	//int a[]={2} 后面的默认输入0
	{
	int i;
	for(i=0;i<13;i++){
		printf("%d\t",a[i]);
		}
		printf("\n");
	}
	
	int x;
	int loc;
	printf("请输入一个数字:");
	scanf("%d",&x);
	loc=search(x,a,sizeof(a)/sizeof(a[0])};
	if(loc!=-1){
		printf("%d在第%d个位置上\n",x,loc);
	}else{
		printf("%d不存在\n",x);
	}
	return 0;
}

int search(int key;int a[],int lenth);

数组的集成初始化

int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32};

直接用大括号给出数组的所有元素的初始值
不需要给出数组的大小,编译器替你数数
={0} 相当于初始化所有都等于零

集成初始化时的定位(c99 only)

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

用[n]在初始化中给出定位
没有定位的数据接在前面的位置后面
其他位置的值补零,={0} 相当于初始化所有都等于零
也可以不给出数组大小,让编译器算
特别适合初始数组稀疏的数组

数组的大小
sizeof 给出整个数组所占的内容的大小,单位是字节
sizeof(a)/sizeof(a[0])
sizeof(a[0])给出数组中单个元素的大小,于是相除就得到了数组单元个数
这样的代码便于修改

int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32,};

后面留 , 便于后来人修改

数组的赋值

int a[]={2,3,4};
int b[]=a;//错误写法

数组变量本身不能被赋值
要把一个数组的所有元素交给另一个元素,必须采用遍历

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

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

常见错误:
循环结束条件是<=数组长度或者
离开循环后,继续用i的值(正好是无效下标)来做数组元素的下标!

int main(void)
{
	int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32};
	int x;
	int loc;
	printf("请输入一个数字:");
	scanf("%d",&x);
	loc=search(x,a,sizeof(a)/sizeof(a[0]));
	if(loc!=-1){
		printf("%d在第%d个位置上\n",x,loc);
	}else{
		printf("%d不存在\n",x);
	}
	return 0;
	}
	/**
	找出key在数组中的位置
	key要寻找的数字
	a要寻找的数组
	length数组a的长度
	如果找到,返回其在a中的值;如果找不到贼返回-1
	**/
int search(int key,int a[],int length)
{
	int ret=1;
	for(i=0;i<length;i++){
		if(a[i]==key){
			ret=1;
			break;
		}
	}
	return ret;
}

数组作为函数参数时,往往必须再用另一个参数来传入数组的大小
不能在 [ ] 中给出数组的大小
不能再利用sizeof来计算数组的元素个数!(指针时候再讲)

判断素数

int isPrime(int x);
int main(void)
{
	int x;
	scanf("%d",&x);
	if(isPrime(x)){
		printf("%d是素数\n",x);
	}else{
		printf("\n不是素数",x);
	}
	return 0;
}
//从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;
}
//去掉偶数后,从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;
}
//无须到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;
}

Unix输入man sqrt,win百度
了解函数功能最好方式
在这里插入图片描述

//判断是否能被已知的且<x的素数整除
int main(void)
{
	const int number=100;
	int prime[number]={2};
	int cont=1;
	int i=3;
	while(count<number){
		if(isPrime(i,prime,count)){
			prime[count++]=i;
		}
		//加大括号调试代码,里面的变量不会影响外面
		{
		printf("i=d\t cnt=%d\t,i,count);
		int i;
		for(i=0;i<number;i++){
			printf("%d",prime[i]);
			}
			printf("\n");
		}
		
		i++;
	}
	for(i=0;i<number;i++){
		printf("%d",prime[i]);
		if((i+1)%5)  printf("\t");
		else printf("\n");
	}
	return 0;
}
	
int isPrime(int x,int kownPrimes[],int numberofKnounPrimes);
{
	int ret=1;
	int i;
	for(i=0;i<numberofKnounPrimes;i++){
		if(x% kownPrimes[i]==0){
			ret=0;
			break;
		}
	}
	return ret;
}

另一种思路
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>

int main()
{
	const int maxNumber=25;
	int isPrime[maxNumber];
	int i;
	int x;
	for(i=0;i<maxNumber;i++){
		isPrime[i*x]=0;
		}
		
	printf("\n");
	return 0;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值