首先介绍一个公式 result = pow(2,n-1)%n,如果result取值为1,则n为质数,不为一则为合数(数学家证出来的,不必深究).
交代一下:不能直接用math.h中的pow函数,因为其返回类型为double型,n的取值范围受限(2的指数级,n最多为1000)
代码如下:
//判断数n是否为质数,因为公式有一些漏洞,即测试数据不准 ,使用时提出来特别讨论即可
//测试不准的数据如下:
//341,561,645,1105,1387,1729,1905,215326,2568226,143742226
#include <stdio.h>
int _10to2(int num,int *b);
int judge(int num);
int main(void)
{
int num = 1;
while(num!=0)
{
scanf("%d",&num);
if(judge(num)==1)
{
printf("%d 是质数\n",num);
}
else
{
printf("%d 是合数\n",num);
}
}
return 0;
}
int judge(int num)
{
int sum=1;
int b[100]={0};
int i=0,k = _10to2(num-1,b);
for(i=0;i<k;i++) //通过二进制来求得sum值,过程中不断对num取余(自行验证)
{
sum = (sum*sum)%num;
if(b[i] == 1)
{
sum = (sum*2)%num;
}
}
return sum;
}
int _10to2(int num,int *b) //十进制转换为2进制
{
int i=0,j=0;
while(num!=0)
{
b[i++] = num%2;
num/=2;
}
for(j=0;j<i/2;j++)
{
int t = b[j];
b[j] = b[i-j-1];
b[i-j-1] = t;
}
return i;
}