素数又称质数,素数只能被自己或者1整数。例如:1,3,5,7,11,13,17,19等都是素数,他们只能被自己本身和1整除,那么,我们怎么通过代码来计算出这个数是不是素数呢?
思路一:
比如,我们要判断17是不是素数,那么,我们就要想办法证明17不能被2~16之间的数字整数,一个都不行。即:在键盘上我们输入一个整数n,假设它是素数,那么它必须不能被 2~(n-1)给整数,如果其中一个能被n整除,那么,他就不是素数。
我们用代码来实现
#include <stdio.h>
int main()
{
int num = 0;//输入的数
int a = 0;//素数的个数,也就是能被几个整除
int i = 0;
printf("请输入一个整数:");
scanf("%d", &num);
for (i = 2; i < num; i++)
{
if (num % i == 0)
{
++a;//能被整除的个数+1
}
}
if (a == 0)
{
printf("%d是素数", num);
}
else
{
printf("%d不是素数", num);
}
return 0;
}
思路二
不需要思路一那么麻烦,判别的次数有点多。只需要被2~√n 之间的每一个整数去除就ok了。如果n不能被2~√n 间任一一个整数整除,那么n必定是素数。例如:19不能被2~5之间的任一整数整除,可以判定19是素数
原因:因为如果n能被2~(n-1)之间某个数整除,其两个因子必定有一个小于或等于√n ,另一个大于等于√n 。
用代码来实现:
#include <stdio.h>
#include <math.h>
int main()
{
int num = 0;//输入的数
int i = 0;//用于循环
int k = 0;//n的平方根
printf("请输入一个整数:");
scanf("%d", &num);
//求平方根,注意sqrt的参数为double类型,所以要强制类型转换
k = (int)sqrt((double)num);
for (i = 2; i <= k; i++)
{
if (num % i == 0)
{
break;
}
//如果完成所有循环,那么num为素数
//注意最后一次循环,会执行i++,此时i=k+1,所以有i>k
}
if (i > k)
{
printf("%d是素数", num);
}
else
{
printf("%d不是素数", num);
}
return 0;
}
c++版本
#include <iostream>
#include <cmath>
using namespace std;
bool is_Prime(int x)
{
if(x < 2) return false;
for(int i = 2; i <= sqrt(x); i++)
{
if(x % i == 0) return false;
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
int x;
scanf("%d",&x);
if(is_Prime(x))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}