数组运算(mooc翁恺笔记)

数组集成初始化:让计算机自己确认大小

数组的元素量: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以内的素数表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值