1. 如何判断一个数为素数?
素数的定义:一个大于1的自然数,除了1和它本身以外,不能被其他自然数(除零以外)整除的数称为素数。
v 比较容易理解思路
#include <stdio.h>
int main()
{
int number,i;
printf("Please input a number:\n ");
scanf("%d",&number);
for(i = 2;i < number;i++)
{
if(number%i == 0)
{
break;
}
}
if(i >= number)
printf("The number is prime number.\n");
else
printf("The number is not a prime number.\n");
return 0;
}
分析:上面这种算法就是利用循环判断从2-number的数据里面有没有number的因数的方法,来判断这个数字到底是不是素数。
程序的思路:首先,利用变量i来循环遍历2-number的值;然后,在循环中判断2-number里面有没有number的因数。如果有,则退出循环。此时,i的值小于number的值,会输出The number is not a prime number;否则,当i的值大于或者等于number的值时,会输出The number is prime number。
v 初等数论的方法
即一个整数不能整除它平方数内的整数就是素数。
上述的判断方法,明显的存在效率极低的问题,其实对于每一个数其实不用从2-number-1都遍历一遍。我们知道,如果一个数可以进行因式分解,那么分解下来的两个数一定是一个大于sqrt(n),一个小于sqrt(n)。据此,上述代码不需要遍历到number-1,遍历到sqrt(n)即可。因为若是在sqrt(n)左侧找不到约数,那么在右侧也一定找不到。
程序代码:
#include <stdio.h>
#include <math.h>
int main()
{
int num,i;
int k;
printf("Please input a number:\n");
scanf("%d",&num);
k = sqrt(num);
for(i = 2;i <= k;i++)
{
if(!(num%i)) //当num%i == 0时,即在2- sqrt(num)中存在其约数
{
break;
}
}
if(i > k)
{
printf("%d is prime.\n",num);
}
else
{
printf("%d is not prime.\n",num);
}
return 0;
}
v 一段数据要求输出素数
本质上和第二个程序的思路相同,只不过又多了一个遍历数据的循环。
#include <stdio.h>
#include <math.h>
int main()
{
int m,i;
int k;
int n = 0;
for(m = 100; m < 200;m++)
{
k = sqrt(m);
for(i = 2; i <= k;i++) //如果在2-sqrt(m)中存在其约数,则退出循环;
{
if(m%i == 0)
break;
}
if(i > k) //如果此时输出i的值大于sqrt(m),证明在2-sqrt(m)中不存在其约数,可以进行输出
{
printf("%5d",m);
n++;
if(n%10 == 0) //输出10个数据,进行换行
printf("\n");
}
}
return 0;
}