关于求素数的算法

素数---只能被自身与1整除的数。

如果我们想要判断n是不是素数,那么我们可以用n除以除了1与它本身的数(i),如果结果都不能被整除,那么它就是素数。(思路)

考虑循环结构,i可以从2(想去避开除以1这个特殊情况)开始,然后判断是否余数为0,如果为零,那么就证明n不是素数;如果不为0,那么我们就可以i++,继续循环,如果一直循环到i == n了还没有余数=0的情况,说明n为素数。

But 如果n = 2的话,就会出现余数为0,但它不是素数

或者我们可以使i = 1,但或许在条件上需要添加一些东西,在循环语句,while与for应该都可以实现

对于while:

#include <stdio.h>
int main ()
{
    int n  ;
    int i = 1;
    while(n%i != 0)
    {
        i = i++;
        if(i == n)
        {
            printf("yes");
        }
        
    }
    printf("no");
    return 0 ;
}

如果是这样的话,我们在i = 1这一关就过不去了,看来得添加一些条件,什么条件呢?这个条件需要对素数一直为真,即括号里面的必须成立:while(n%i !=0 || i == 1 || i== n) 这样的话,就算i= 1时第一个条件对于素数为假,但第二个为真,因此为真,就可以循环了,对于不是素数的数,在i++中所有的条件都为假,就会跳出循环了:

#include <stdio.h>
int main ()
{
    int n  ;
    scanf_s("%d",&n);
    int i = 1;
    while(n%i != 0 || i == 1 || i == n)
    {
        i = i++;
        if(i == n)
        {
            printf("yes");
        }
        
    }
    printf("no");
    return 0 ;
}

但注意,在if语句中的printf后应该接一个break,表示循环终止,否则一直被困在循环里面了

BUT当我们跳出这个循环时,马上接下一个printf了!,输出结果可能就是yesno

怎么解决???

我的解决方法是 把前一个printf改为一个数的赋值,然后结束循环后用if else语句来输出

int m = 1;
while (n % m != 0 || m == n || m == 1)
{
	m = m++;
	if (m > a)
	{
		n = 0; break;
	}
}

if (n == 0)
{
	printf("yes");
}
else
{
	printf("no");

写到这里,我又想到了一种方法来解决i = 1这一关:

#include <stdio.h>
int main ()
{
    int n  ;
    scanf_s("%d",&n);
    int i = 1;
    while(n%(i+1) != 0 && (i+1) !=n)
    {
        i = i++;
        if(i +1 == n)
        {
            printf("yes");
        }
        
    }
    printf("no");
    return 0 ;
}

这样就解决了i = 1的问题,也解决了n = 2的问题,但没有解决yesno的问题-_-

当然我们也可以用for语句来写这个题

int n, i;
	scanf_s("%d", &n);     
	for (i = 1; i <= n; i++)
	{
		if (n%(i + 1)==0 && (i+1)!= n)   
		{
			printf("no"); break;
		}
		else 
		{
			printf("yes"); break;
		}
	}

这样就更加简单了

但还可以更简单

我们没必要一直算到i = n,只需要算到根号n就可以了,因为如果n不是素数,那么n = a * b必然会有a>根号n(b<根号n)或者相反,所以只要判断到根号n就可以找出a或b

如果要用的话需要引用头文件#include <math.h>

sqrt(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值