素数---只能被自身与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)