数组集成初始化:让计算机自己确认大小
数组的元素量:sizeof(a)/sizeo(a[0])
数组不能直接复制,需要遍历(通常使用for循环)
例子1:确认输入的数是否在函数里面,如果在哪在哪里?
#include <stdio.h>
int search(int key, int a[], int length);//声明后面要加分号,函数不用
int main()
{
int x, loc, a[] = { 2,4,6,7,1,3,5,9,11,13,23,14,32 };//数组集成初始化
printf("请输入一个数字:");
scanf_s("%d", &x);
loc = search(x, a, sizeof(a) / sizeof(a[0]));//安全便捷
if (loc != -1)
printf("%d在第%d个位置上\n", x, loc);
else { printf("%d不存在", x); }
}
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;//满足条件就输出位置,不满足就输出-1
}
例子2 素数的计算
判断是否是素数
思路一:从2到x-1测试是否可以整除(对于n要循环n-1≈n次)
思路二:去掉偶数后,从3到x-1,每次加2(如果n是偶数直接结束,否则要循环(n-3)/2+1≈n/2次)
思路三:直接到sqrt(x)(只需循环sqrt(x)遍)(why?因为合数必有一个小于或等于其平方根的因数)
思路三代码示例
#include<stdio.h>
#include<math.h>
int isPrime(int x);
int main()
{
int x,ban;
scanf_s("%d", &x);
if (isPrime(x)) { printf("%d是素数",x); }
else
{
printf("%d不是素数",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小的素数来测试x是不是素数(前提:需要一张素数表)适用于我正好在构造这一张表
构造素数表的方法
1直接使用上述判断素数的思路把素数加入数组2
int main
2先假设所有的的数都是素数,从2开始删2的倍数(不删2),然后删3的,以此类推,留下来的就是素数
#include <stdio.h>
int main()
{
const int maxNumber= 25;
int isPrime [maxNumber];//vs2019只能[]里只能用常数
int i, 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 = 2; i < maxNumber; i++) {
if (isPrime[i]) { printf("%d\t", i); }
}
printf("\n");
return 0;
}//这样就打印了一张25以内的素数表