C语言 第七周知识点随记

数组运算

数组的集成初始化

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

遍历数组输出的是 2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32,我们写入的数组会依次用来初始化数组的每一个单元。编译器帮我们设定好了容量为13个整数的数组。

int a[13] = {2};
输出的结果显示,数组a中的第一个数是2,剩下的12个都为0

int count[100] = {0};
达到的效果也就是:

int count[100];
for (i=0; i<100; 1++) {
    
    
	count[i]=0;
}

集成初始化时的定位

int a[10]={
    
    
	[0]=2, [2]=3, 6
};
  • [n]在初始化数据中给出定位

  • 没有定位的数据接在前面的位置后面

  • 其他位置的值补零

  • 也可以不给出数组大小,让编译器算

  • 特别适合初始数据稀疏的数组

    c99才行!

数组的大小

  • sizeof给出整个数组所占据的内容的大小,单位时字节
    sizeof(a)/sizeof(a[0])
  • sizeof(a[0])给出数组中单个元素的大小,于是相处就得到了数组的单位个数
  • 这样的代码,一旦修改数组中初始的数据,不需要修改遍历的代码

数组的赋值

int a[] = {
    
    2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32}
int b[] = a; //不能这样赋值
  • 数组变量本身不能被赋值
  • 要把一个数组的所有元素交给另一个数组,必须采用遍历
for ( i=0; i<length; i++) {
    
    
	b[i] = a[i];
} 

遍历数组

数组赋值

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

数组初始化

for (i=0; i<number; i++){
    
    
	count [i] = 0;

找出数组中某一值

for ( i=0; i<length; i++){
    
    
	if (a[i] == key ){
    
    
		ret = i;
		break;
	}
}

打印数组

for (i=0; i<number; i++){
    
    
	printf("%d;%d\n",i,number);
	}
  • 通常都是使用for循环,让循环变量i从0到<数组的长度,这样循环体内最大的i正好是数组最大的有效下标
  • 常见错误是:
    • 循环结束条件是<=数组长度(i从0开始累加,i=数组长度-1刚好遍历数组)
    • 离开循环后,继续用i的值来做数组元素的下标(i++了)
/*
找出key在数组a中的位置
@param key 要寻找的数字
@param a 要寻找的数组
@param length 数组a的长度
@return 如果找到,返回其在a中的位置;如果找不到则返回-1
*/
int search(int key, int a[], int length);

int main(void)
{
    
    
	int a[]={
    
    2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 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;
}

int search(int key, int a[], int length)
{
    
    
	int ret = -1;
	int i;
	for(i=0; i<length; i++) {
    
    
		if(a[i] == key ){
    
    
			ret = i;
			break;
		}
	}
	return ret;
}

数组作为函数的参数时:

  • 不能在[]中给出数组的大小
  • 不能再利用sizeof来计算数组的元素个数

数组例子:素数

首先搭一个主程序的框架

主程序

  • 如果isPrime不是素数输出“不是素数”,如果isPrime是素数输出“是素数”。
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;
}

isPrime

方案1:

  • 从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遍

方案2:
去掉偶数后,从3到x-1,每次加2

思路

  • 如果x是偶数,立刻判断非素数
  • 否则循环(n-3)/2+1遍
  • 当n很大时就是n/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-3)/2+1遍
  • 当n很大时就是n/2遍

方案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;
}

判断是否能被已知的且<x的素数整除

int main(void)
{
    
    
	const int number = 100;	//100个素数
	int prime[number] = {
    
    2};	//初始化数组,第一个素数为2
	int count = 1;	//已知素数个数
	int i = 3;	//
	while ( count < number){
    
    
		if (isPrime(i, prime, count)){
    
    
			Prime[count++] = i;	//赋值时指向的是Prime[count],赋完值后count=count+1
		}
		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 knownPrimes[], int numberOfKnownPrimes)
{
    
    
	int ret = 1;	//假设x是素数
	int i;
	// 用x除去素数表中的数,若能被整除,则不是素数;反之,ret = 1,是素数
	for(i=0; i<numberOfKnownPrimes; i++){
    
    
		if(x%knownPrimes[i]==0){
    
    
		ret = 0;
		break;
		}
	}
	return ret;
}

{}去看i和数组变化

构造素数表

  1. 令x为2
  2. 将2x、3x、4x直至ax<n的数标记为非素数
  3. 令x为下一个没有被标记为非素数的数,重复2;知道所有的数都已经被尝试完毕。

猜你喜欢

转载自blog.csdn.net/m0_71290816/article/details/127082646
今日推荐