西工大2019年计算机机试第四题:找素数(递归法)

问题:

从M开始找到第n个质数;

例如输入: 4 3

输出:5 7 11

分析:

问题的关键在于素数的判断。

想法:先定义一个函数判断一个数是否为素数,通过for循环判断(只能被1和本身整除的数);再构造一个递归函数,功能是找出从m开始(包含m)n个素数。递归函数中调用判定素数函数,弱一个数是素数的话,输出到控制台上,同时素数数量减1,本身加1,接着往下找。

代码:

#include<iostream>
using namespace std;
bool flag = true;          //初始化为true
bool judge(int m)          //布尔类型,判定是否是素数,素数为true,非素数为false
{
	if (m <= 1)            //最小素数为2,
		flag = false; 
	else if (m == 2)       
		flag = true;
	else if (m > 2)       //素数定义来判断是否为素数
	{
		for (int i = 2; i < m; i++)//循环判断是否为素数
		{
			if (m % i == 0)
			{
				flag = false;
				break;               //非素数直接退出本层循环,不再进行以后的判断
			}
			else
				flag = true;         //素数返回true
		}
	}
	return flag;                     //返回素数判定标志
}


void search(int m,int n)            //递归函数,寻找素数个数,从m开始找出n个素数
{
	if (n <= 0)                          //直接返回,作为寻找完毕的判定条件
	{
		return;
	}
	
	if (judge(m))                  //素数判定标志,条件为真则执行if中语句
	{
		cout << m <<" ";	       //输出
		n--;                       //素数个数减1
		m++;                       //寻找m下一位
	}
	else                           //非素数
	{
		m++;                       //接着寻找下一位
	}
	search(m, n);                  //递归
}


int main()
{
	int m,n;
	cin >> m>>n;
	search(m, n);                   //递归调用
	return 0;
}
现在感觉递归能代替某些条件下的循环,降低程序时间复杂度。

猜你喜欢

转载自blog.csdn.net/Crazy__1/article/details/88750064