中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题

自测-2 素数对猜想
让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:

20

输出样例:

4

分析
这个问题一度令我很头疼,我试着按贺老师说的机械化思维去走,但是流程将自己弄糊涂了。于是跳出具体的问题,宏观的来看,有时会发现不一样的东西,发现这道题的核心其实是判断一个数是否为素数。这样的话就可以将这一功能单拎出来写成一个函数,然后在自己的程序里复用就可以了。
核心流程
找到一个素数就加2看看是不是素数,如果是就计数,不是就继续找
其中每字就是循环的意思;是不是素数就是在使用判断素数的函数。

#include
#include
// 函数声明,这是一个判断是否为素数的函数    
int tellPrimeNumber(int m);           
int main()                     
{
	int i,j=0;//声明主函数的循环变量和统计素数对的变量 
	int num,returnValue;//声明N和scanf的返回值 
	returnValue = scanf("%d",&num);//读入N的值 
	//对scanf的返回值进行处理 
	if(returnValue==1){
		//从3开始,每次加2,判断是否是素数,因为比3大的偶数都不是素数 
		for(i=3;in){             
		return 1;       /*是素数就返回1*/
	}else{
		return 0;     /*不是素数就返回0*/
	}
}

但是遇到了问题,5个测试点过了4个,提示最后的那个是超时,我才意思到可能是执行效率太低了,但本程序的核心并不在大框架上,仍然在判断是否为素数那个函数上,要想办法提高函数的效率,后来发现判断一个数m是不是素数不需要从2到m-1挨个除,只需要除到根号m就可以,于是参考网上的除到根号m的算法,一改果然好使!

你可能感兴趣的:(中国大学MOOC-陈越、何钦铭-数据结构-起步能力自测题)