您的位置:首页 > 编程语言 > C语言/C++

一步一步写算法(如何判断一个素数和一段素数)

2017-10-21 22:52 309 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言