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

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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值