关于素数的小tips。

题目:判断 101 到 200 之间的素数。 

解题思路:首先明确素数的定义,除了1和它本身之外没有其他因数的数即素数。为了得到普适的程序,可以把该问题转换为——输入一个数n,判断其是否为素数。

(一)使用循环直接写程序

①将n作为被除数,将2~n-1各个整数先后作为除数,如果都不能被整除,则n为整数。

解题关键在于检索in值的大小,若n不为素数,则在for循环中会直接跳出,所得的i的值必定小于n;若n为素数,则i的值一定是按照正常的2~n逐个检索,要使n%i为0,则i必定大于n。

#include<stdio.h>
int main()
{
	int n,i;
	scanf("%d",&n);
	for(i=2;i<n;i++)
	{
		if(n%i==0)break;  //若n不是素数,取余后得0,直接跳出循环进行下一步检索
	}
	if(n>i)
		printf("%d is not a prime.",n);
	else
		printf("%d is a prime.",n);
	return 0;
}

 ②为了进一步改进,发现只需要检索到该数的平方根即可。

#include<stdio.h>
#include<math.h>  //sqrt函数的头文件
int main()
{
	int n,i;
	scanf("%d",&n);
	for(i=2;i<sqrt(n);i++) //只需把n换成根号n即可
	{
		if(n%i==0)break; 
	}
	if(sqrt(n)>i)
		printf("%d is not a prime.",n);
	else
		printf("%d is a prime.",n);
	return 0;
}

(二) 采用函数思想

 定义一个prime函数(模块化程序设计思路)可写出下列程序:

(判断in的关系时,可以先代入一个例子利于找规律。)

#include<stdio.h>
int main()
{
	int prime(int n); //函数声明
	int n;
	scanf("%d",&n);
	if(prime(n))  //函数调用
		printf("%d is a prime.",n);
	else
		printf("%d is not a prime.",n);
	return 0;
}
int prime(int n)  //函数定义
{
	int r,i=2;
	do
	{
		r=n%i;
		i++;
	}while(r!=0); 
	if(i==n+1)   // i>n
		return 1;
	else
		return 0;
}
/*
	while(r!=0)
	{
		r=n%i;
		i++;
		if(i==n+1)
			return 1;
	}
	return 0;
*/

 解题:有了以上基础,要求101到200之间的素数,只需要增加一个外循环对区间内的整数一一进行判定,也就是一个嵌套的for循环。

思路①

#include<stdio.h>
int main()
{
	int n,i;
	for(n=101;n<201;n++)
	{
	    for(i=2;i<n;i++)
		{
		    if(n%i==0)break; 
		}
	    if(n==i)
		    printf("%d\n",n);
	}
	return 0;
}

思路②

#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,N;
	for(N=101;N<201;N++)
	{
		n=sqrt(N);
	    for(i=2;i<n;i++)
		{
		    if(N%i==0)break; 
		}
	    if(n<=i)
		    printf("%d\n",N);
	}
	return 0;
}

结果如下:

101
103
107
109
113
121
127
131
137
139
143
149
151
157
163
167
169
173
179
181
191
193
197
199
Press any key to continue


还是要多看多理解叭#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值