C语言-素数和最大公约数

本文介绍了如何使用C语言判断一个数是否为素数,并提供了两种减少循环次数的方法。此外,还详细讲解了如何构造素数表以及输出100以内的素数。对于最大公约数的求解,文章分别阐述了穷举法和辗转相除法的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

素数

判断一个数是不是素数

重点:变量isPrime作为标志,用来判断,用break跳出循环。程序中可设这种变量作为标志。

    printf("--------------判断一个数是不是素数------------\n");
    int num1;
    printf("请输入一个整数:");
    scanf("%d", &num1);

    int k;
    int isPrime = 1;
    for(k=2;k<num1;k++)
    {
        if (num1%k == 0)
        {
            isPrime = 0;
            break;//continue;
        }
        //printf("%d\n",k);
    }
    if (isPrime==1)
    {
        printf("这个数是素数。\n");
    }else
    {
        printf("这个数不是素数。\n");
    }

减少循环次数方法一

方法:偶数不参与循环,可直接被判断为不是素数。每次循环加2。

//简化素数问题:循环走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;
        }
    }
}

减少循环次数方法二

输出0-25之间所有的素数。

方法:构造一个长度为25的数组,数组下标即为对应的数字,数组元素的值代表这个数是不是素数,1为是,0为不是。通过标记每个数的倍数不是素数循环。

#include <stdio.h>
#include <stdlib.h>

//构造素数表
//数组元素值为1的是素数
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++){
                inPrime[i*x] = 0;
            }
        }
    }
    for(i=2;i<maxNumber;i++){
        if(isPrime[i]){
            printf("%d\t",i);
        }
    }
    printf("\n");
    return 0;
}

构造素数表

100个素数组成的表。

方法:每加入一个数都判断是否能被已知的并且小于自己的素数整除。

#include <stdio.h>
#include <stdlib.h>

//再简化:判断是否能被已知的并且小于自己的素数整除
int isPrime(int x, int knownPrimes[],int numofknownPrimes)
{
    int ret =1;
    int i;
    for(i=0;i<numofknownPrimes;i++){
        if(x%knownPrimes[i]==0){
            ret=0;
            break;
        }
    }
    return ret;//ret=1说明是素数,1为真
}

int main()
{
    const int number = 100;//数组长度
    int prime[100] = {2};//初始化数组
    int count = 1;
    int i = 3;
    while(count<number)
    {
        if (isPrime(i,prime,count))
        {
            prime[count++] = i;//更新素数表
            //这一行代码做了两件事情
            //1 prime[count]=i;
            //2 count++;
        }

        i++;
    }
    for(i=0;i<number;i++)
    {
      printf("%d", prime[i]);
      if((i+1)%5) printf("\t");
      else printf("\n");
    }

    return 0;
}

输出100以内的素数

    printf("--------------输出100以内的素数-------------\n");
    int m;
    for(m=2;m<=100;m++)
    {
            int n;
            int isPrime1 = 1;
            for(n=2;n<m;n++)
        {
            if (m%n == 0)
            {
                isPrime1 = 0;
                break;//continue;
            }
            //printf("%d\n",k);
        }
        if (isPrime1 == 1)
        {
            printf("%d ", m);
        }
    }
    printf("\n");

求最大公约数

穷举法

    printf("------------------求最大公约数------------------\n");
    int a,b;
    printf("a=");
    scanf("%d",&a);
    printf("b=");
    scanf("%d",&b);    
    
    int min;
    if(a>b)
    {
        min = b;
    }
    else{
        min = a;
    }
    int j;
    int ret;
    for(j=1; j<min; j++)
    {
        if(a%j == 0)
        {
            if(b%j == 0)
            {
                ret = j;
            }
        }
    }
    printf("%d和%d的最大公约数是%d.\n",a,b,ret);

辗转相除法

    printf("------------------求最大公约数------------------\n");
    int a,b;
    printf("a=");
    scanf("%d",&a);
    printf("b=");
    scanf("%d",&b);
    /*
    辗转相除法:如果b为0,a就是最大公约数。否则,计算a%b,另a=b,b=a%b
    a   b   t
    12  18   12
    18  12   6
    12  6    0
    6   0
    */
    while(b!=0){
       int t= a%b;
       a=b;
       b=t;
    }
    printf("最大公约数为:%d\n", a);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值