20240316,数组,素数【没搞懂的】

文章详细探讨了C语言中数组的使用,包括输入范围控制、数组初始化、统计元素个数、数组赋值、函数参数传递以及素数的查找方法。作者还提及了C99标准在某些操作中的影响。
摘要由CSDN通过智能技术生成

 一,数组

1.1 越界

法一:输入的时候计数,超过范围不再输入

法二:自己先输入数组的范围
……试了一下没有试出来……丢,会INT NUMBER[CNT]会报错,看来我这不是C99?

1.2 统计个数

#include<stdio.h>
int main(void) {
	const int number = 10;
	int x ;
	int count[number];
	int i = 0;
	for (i = 0; i < number; i++) { 
		count[i] = 0;
		//printf("%d\n", count[i]);
	}//初始化数组,试过了不初始化会得到奇怪的值,但是运算是对的
	scanf("%d", &x);
	while (x > -1) {
		if (x >= 0 && x <= 9) {
			count[x]++;
		}
		scanf("%d\n", &x);
	}
	for (i = 0; i < number; i++) {
		printf("%d的个数是%d\n", i,count[i]);
	}
	return 0;
}

第一个是,VS不支持INT NUMBER[CNT]这样的写法,但是DEV可以
第二个是,理论上应该-1结束,但是-1结束不了,两个软件都是-2结束的,>-1和!=-1都试过了

1.3 集成初始化

int count[] = { 2 ,452,5,3,6,6,2,5,32,1,3,3,5};
int i = 0;
for (i = 0; i <13; i++) { 
	printf("%d\n", count[i]);
}
int count[13] = {2};
int i = 0;
for (i = 0; i <13; i++) { 
	printf("%d\n", count[i]);
}

第一个是2 后面全部是0,
上一题初始化的简单写法 int count[]={0}

int count[13] = {[2]=2,[10]=888};
printf("%lu\n", sizeof(count));
printf("%lu\n", sizeof(count[13]));
for (i = 0; i < sizeof(count)/sizeof(count[0]); i++) {
	printf("%d\n", count[i]);
}

数组的大小,连续记录,安全的范围

1.4 赋值

不能int b[] = count;只能遍历数组

int b[];
for (i = 0; i < sizeof(count)/sizeof(count[13]); i++) {
	b[i] = count[i];
}
< sizeof(count)/sizeof(count[13]这是最不容易出错的写法
并且循环结束后,I的值正好是数组最大的有效下标
!!!!但是,不能做数组元素的下标
int count[13] = {6,677,2,3,57,21,89,26,33,67,2,1,24,};
int i = 0;
int x;
scanf_s("%d", &x);
for (i = 0; i < 13; i++) {
	if (x == count[i]) {
		printf("数%d在数组的%d位置上\n",x,i);
		break;
	}
	else {
		printf("不存在\n");
	}
}

一点小问题,这里“不存在”是循环输出的

#include<stdio.h>
int main() {
	int sea(int key, int a[], int lll);
	//声明
	int a[] = { 3,6,7,8,2,6,14,2342, };
	int key;
	scanf_s("%d", &key);
	int lll = 8;//可以省,不设置这个变量直接带入8
	int ret = sea(key, a, lll);
	if (ret != -1) {
		printf("%d存在,位置是%d", key, ret);
	}
	else {
		printf("不存在");
	}

	return 0;
}

//哦哦,这是一个函数,定义
int sea(int key, int a[], int lll)
{
	int ret = -1;
	int i;
	for (i = 0; i < lll; i++) {
		if (a[i] == key) {
			ret = i;
			break;
		}
	}
	return ret;
}

****数组作为函数参数的时候,往往必须再用另一个参数来传入数组的大小
数组作为函数的参数时:
不能在【】中给出数组的大小
也不能用SIZEOF()计算数组的元素个数了

0317补:我是实在没有听懂讲的什么东西
现在的勉强理解就是,在函数里面需要数组作为参数的时候,只能在小括号里面写a[注意!中括号里面是空的],再用另一个参数来传入数组的大小,好像是,我们知道a[11】但是不能直接写,只能写INT A[].INT B,B可以是一个数字,可以是一个字母??????

1.5 素数****

逻辑N-1遍——偶数除开,N/2遍——平方根!已经是最大的因数了!!!sqrt(x)遍——判断能否被已知的小于X的素数整除!!!【理解一下就是,分解因数!!!】
虽怕但头铁

1.5.1 分解最小因数
#include<stdio.h>
int main() {
	//设置变量,统计100以内的素数,弄进数组,遍历除数组,得到结论
	const int number=10;
	int a[number] = { 2 };
	int i;
	int t=0;
	for(i=2;t<100;i++){
		if(i/a[number]!=0){
			t++;
			a[t]=i; 
		}
	}
	for(t=0;t<10;t++){
		printf("%d\t",a[t]);
	}
	return 0;
}

错的,啊啊啊啊啊罢了,不要为难自己,输出的结果离谱的让我想噶
我是真的菜,我的天啊

#include<stdio.h>//没跑成功 
int isprime(int x,int knownprimes[],int numberofknowprimes);

int main(void) {
	const int number=100; 
	int prime[number]={2};//构造了素数表,初始化为2 
	int count=1;//因为有一个数了,count为1 
	int i=3;//从3开始测试是不是素数 
//	{
//		int i;
//		printf("\t\t\t\t");
//		for(i=0;i<number;i++){
//			printf("%d\t",i)
//		} 
//	}//测试的时候输出表头 
	
	
	while(count<number){
		if(isprime(i,prime,count)){
			//把I输入函数,看是不是,如果是,加入数组
			//判断的结果是0,1,函数的结果也是0,1 
			prime[count++]=i;
			//做了两件事,count++是给COUNT的值加1,但是输出加1之前的值
			//PEIME[COUNT++]=PRIME[COUNT],但是,此时COUNT已经加1了,指向了下一个位置 
		}
		
//		{
//			printf("i=%d\tcnt=%d\t",i,count);
//			int i;//只有C99可以,在我定义之前,I是外面的I,
//这个I和外面的I没有关系,只是运算到这里,变成了里面的I 
//不是C99,就是再加一个括号 
//			for(i=0;i<number;i++){
//				printf("%d\t",prime[i]);
//			} //遍历 
//			printf("\n");
//		}调试 

		i++;
	}
	for(i=0;i<number;i++){
		prinntf("%d",prime[i]);//报错 
		if((i+1)%5)printf("\t");
		else printf("\n");//这里就是依次输出数组内容,以及为了%5是让格式美观一点
	}

	return 0;
}

int isprime(int x,int knownprimes[],int numberofknowprimes)//最后一个报错 
{
	int ret=1;
	int i;
	for(i=0;i<numberofknownprimes;i++){
		if(x%knownprimes[i]==0){
			ret=0;
			break;
		}
	}
	return ret;
}

1.5.2 反向构造素数表
#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;
	}
	for(x=2;x<maxNumber;x++){
		if(isPrime[x]){
			for(i=2;i*x<maxNumber;i++){
				isPrime[i*x]=0;
			}
		}
	}
	for(i=1;i<maxNumber;i++){
		if(isPrime[i]){
			printf("%d\t",i);
		}
	}
	printf("\n");
	return 0;
} 

我哭死,这次不仅没有打错,而且能跑,我真的哭死,当然,这么晚了,我的脑子只允许我抄打一份

#include<stdio.h>
int main(){
	const int maxNumber=25;//所以求25以内的素数 
	int isPrime[maxNumber];
	int i;
	int x;
	for(i=0;i<maxNumber;i++){
		isPrime[i]=1;
	}//初始化数组,1 ,假定都是素数 
	
		{//表头 
		//for test
		printf("\t");
		for(i=2;i<maxNumber;i++){
			printf("%d\t",i);
		} 
		}printf("\n");
		//for test	 
	
	for(x=2;x<maxNumber;x++){
		if(isPrime[x]){//X=2的时候,是1,会进入循环,基于我们已经知道2是素数 
			for(i=2;i*x<maxNumber;i++){
				isPrime[i*x]=0;//把2的倍数都标记为非素数,0,不会进入IF 
			}
		}
		//for test
		printf("%d\t",x);
		for(i=2;i<maxNumber;i++){
			printf("%d\t",isPrime[i]);
		}printf("\n");
		//for test
	}
	for(i=1;i<maxNumber;i++){
		if(isPrime[i]){
			printf("%d\t",i);
		}//遍历数组,找到数组的变量为1时,数组的标号 
	}
	printf("\n");
	return 0;
} 

1.6 二维数组

呵呵,我真的麻了,一维的我都麻了,明天再说

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值