C语言——判断一个数是不是素数 && 给定整数m和n区间内素数的个数并对它们求和 && 输出n以内的素数

素数,指的是大于1的整数中,只能被1和这个数本身整除的数 

注意:1不是素数

一.判断一个数是不是素数

方法一:一般方法

假设这个数是n,我们就拿这个数和从2到n-1的每个数去和这个数做取余操作,如果有一个数可以使得余数为0,则这个数不是素数,反之则这个数为素数。

//判断一个数是不是素数
#include <stdio.h>
int main()
{
    int a;
    printf("请输入一个数:\n");
    scanf("%d", &a);
    int t=1;
    for (int i = 2; i < a; i++)
    {
        if (a % i == 0)
        {
            t = 0;
            break;
        }
    }
    if (t == 0)
    {
        printf("%d 不是素数!\n", a);
    }
    else
    {
        printf("%d是素数!\n", a);
    }
    return 0;
}

方法二: 不超过本身的1/2

每个数的因数中,其中一个不会超过本身的1/2;

比如:因为1*12=12  2*6=12  3*4=12  所以12的因数有1和12,2和6,3和4,每组因数中都有一个不会超过12这个数的1/2;

这样我们就可以对方法一优化一下

#include <stdio.h>
int main()
{
    int a;
    printf("请输入一个数:\n");
    scanf("%d", &a);
    int t=1;
    for (int i = 2; i < a/2; i++)
    {
        if (a % i == 0)
        {
            t = 0;
            break;
        }
    }
    if (t == 0)
    {
        printf("%d 不是素数!\n", a);
    }
    else
    {
        printf("%d是素数!\n", a);
    }
    return 0;
}

方法三:不超过本身的开方

每个数的因数中,其中一个不会超过本身的开方;

比如:因为1*16=16  2*8=16 4*4=16  所以16的因数有1和16,2和8,4和4,每组因数中都有一个不会超过16这个数的开方;

这样我们就可以对方法二优化一下

#include <stdio.h>
#include <math.h>
int main()
{
    int a;
    printf("请输入一个数:\n");
    scanf("%d", &a);
    int t = 1;
    for (int i = 2; i <= sqrt(a); i++) //sqrt()是开方的意思,这个函数在math.h文件里
    {
        if (a % i == 0)
        {
            t = 0;
            break;
        }
    }
    if (t == 0)
    {
        printf("%d 不是素数!\n", a);
    }
    else
    {
        printf("%d是素数!\n", a);
    }
    return 0;
}

  二.给定整数m和n区间内素数的个数并对它们求和.

方法一:一般方法

// 本题要求统计给定整数M和N区间内素数的个数并对它们求和.

//1不是素数,单独考虑1

#include <stdio.h>
int main()
{
    int m, n, flag = 0, sum = 0, t = 0;
    printf("请输入M和N的值(1<=m<=n<=500):\n");
    scanf("%d%d", &m, &n);
    for (int i = m; i <= n; i++)
    {
        if(i==1)
            i = 2;
        for (int j = 2; j < i; j++)
        {
            if (i % j == 0)
            {
                flag = 1;//不是素数,flag=1
                break;
            }
        }

        if (flag == 0)  //flag==o,是素数的情况
        {
            t++;
            sum += i;
            // printf("%d为素数\n", i);//这句话可以用来输出素数
        }
        else        //flag==0,不是素数的情况
            flag = 0;
    }
    printf("%d与%d之间有%d个素数\n", m, n, t);
    printf("它们的和为%d\n", sum);
}

 三.输出n以内的素数

方法一:一般方法

在判断一个数是不是素数的基础上加一个循环

#include <stdio.h>
#include <math.h>
int main()
{
    int number, isPrime = 1, x;
    printf("请输入一个数:\n");
    scanf("%d", &number);
    printf("%d里的素数有:", number);
    for (int y = 1; y <= number; y++)
    {
        for (int i = 2; i < sqrt(y); i++) // 判断y是不是素数//如果y不是素数,则isPrime = 0;
        {
            if (y % i == 0)
            {
                isPrime = 0;
                break;
            }
        }

        if (isPrime != 0)
        {
            printf("%d ", y);
        }
        else
        {
            isPrime = 1;
        }
    }
    return 0;
}

方法二:倍数

1.令x为2

2.将2x、3x、4x直至ax (ax< n)的数标记为非素数

3.令x为下一个没有被标记为非素数的数,重复2

4.直到所有的数都已经尝试完毕

//将n以内所有的数的isPrime值为1(真)——数组

//将所有的2(3,4...)的倍数的数的isPrime值为0(假)——循环

//输出剩下isPrime值为1(真)的数——循环


#include <stdio.h>
int main()
{
    int i;
    int x;
    int maxNumber;
    printf("请输入一个数:\n");
    scanf("%d", &maxNumber);
    int isPrime[maxNumber+1];
    for (i = 1; i < maxNumber+1; i++)
    {
        isPrime[i] = 1; // 让所有的isPrime[i]值为1,即先将所有数标记为素数
    }
    for (x = 2; x < maxNumber; x++) // 让x从2开始,往后,x为下一个标记为素数的数,(因为for循环只有一个if语句,x如果是标记为非素数(isPrime[x]=0)的数,那么x无法进入if,那便继续x++,直到x为下一个没有标记为非素数的数即可进去if)
    {
        if (isPrime[x]) // isPrime为真(即为1)的话进入if
        {
            for (i = 2; i * x < maxNumber+1; i++) // i*x为 2(3,4...)倍的x
            {
                isPrime[i * x] = 0; // 令x的2(3,4...)倍数的数isPrime值为0
            }
        }
    }
    for (i = 2; i <= maxNumber; i++)
    {
        if (isPrime[i]) // isPrime为真(即为1)的话进入if
        {
            printf("%d ", i);
        }
    }
    printf("\n");

    return 0;
}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值