每日一小练——求质数

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练!

题目:求质数

内容:

试编写一个程序,找出前N个质数。如果没有进一步要求,这不是难题。但在此希望从所知的、使用除法的方法中,用最快的办法来编写程序。

我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神。。奥,不对就解决了!这个题目确实很简单,先看看常规解法吧!

#include <iostream>
#include <math.h>
#define endNum 200
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	bool isPrime(int x);
	cout << endNum << "以内的之所以素数为:" << endl;
	for (int i = 2; i < endNum; i++)
	{
		if (isPrime(i))
			cout << i << "  ";
	}
	getchar();
	return 0;
}

bool isPrime(int x)
{
	int endP = sqrt(x);
	bool rusult = true;
	for (int i = 2; i <= endP; i++)
	{
		if ((x % i) == 0)
		{
			rusult = false;
		}
	}
	return rusult;
}

实验结果是

不过题目中要求了思索除法范围内最快的算法,其实就是在循环中,减少以至不为质数的值的除法运算,比如2的倍数,3的倍数,和5的倍数。这样循环的递增就不是按照+1递增了,而已2,4,2,4....循环加法递增,这样可以减少循环三分之二的工作量。

改价算法如下

#include <iostream>
#include <math.h>
#define endNum 200
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	bool isPrime(int x);
	int addNum = 2;
	cout << endNum << "以内的之所以素数为(改进算法):" << endl;
	cout << "2  3  5  ";
	for (int i = 7; i < endNum; )
	{
		if (isPrime(i))
			cout << i << "  ";
		addNum = 6 - addNum;
		i += addNum;
	}
	getchar();
	return 0;
}

bool isPrime(int x)
{
	int endP = sqrt(x);
	bool rusult = true;
	for (int i = 2; i <= endP; i++)
	{
		if ((x % i) == 0)
		{
			rusult = false;
		}
	}
	return rusult;
}

实验结果:

最后要感谢Clover_tjp同学提出的建议,我会在以后的每日一下练中加以改进,欢迎大家提出自己的意见哈!

欢迎大家加入每日一小练,嘿嘿!

每天练一练,日久见功夫,加油!

      -End-

参考文献:《c语言名题精选百则》

每日一小练——求质数,布布扣,bubuko.com

时间: 2024-12-24 23:10:44

每日一小练——求质数的相关文章

每日一小练——Eratosthenes 筛选法

上得厅堂.下得厨房.写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:Eratosthenes筛选法 内容: 求质数是一个非常普遍的问题,通常不外乎用数去除.除到不尽时,给定的数就是质数. 可是早在2000年前人们就知道了一个不必用除法而找出2~N的全部质数的方法.如果一个非常奇妙的筛子,能够给出一个数.比如i,这个筛子有办法把i全部的倍数去掉. 请用这种方法求出2~N之间的全部质数.即Eratosthenes筛选法. 我的解法:上来没多想.打开vs2013就敲了起来.问题果然非常eas

每日一小练——列出全部子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:列出全部子集 内容:写一个程序,列出{1,2,3,4,...,n}这个集合的全部子集,包含空集{ }. 解决问题的算法应该有非常多种,只是我发现了一种非常easy也非常好玩的方法,就是用二进制表示几何元素的方法 比方假设n是3,则子集有(不包含空集){1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}就是1*{0,1}and2*{0,1}and3{0,1}每一个组合出现一次,所以也能够看成是{0,0,1}{0

每日一小练——快速Fibonacci数算法

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:快速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有如下规律: 尝试寻找快速的求出fn的方法 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了! 其实题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,不过因为求解快速方法在递归之前,我编写了一个非递归的算法 #include <iostream> usi

每日一小练——按字典顺序列出全部子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的全部子集找出来. 解答: 想必我就不用解释什么是字典顺序了,作为乘虚猿和攻城狮大家应该懂得,无论你懂不懂,反正我懂了! 事实上我们能够先列出一个实例,观察规律: 比如n=3 {1} {1,2} {1,2,3} {1,3} {2} {2,3} {3} 能够看出这种规律(假设你说我怎么没看出来,事实上你能够再多看一会!) 令一个

每日一小练——等值首尾和

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:等值首尾和 内容: 假设有一个数组x[],它有n个元素,每一个都大于零:称x[0]+x[1]+...+x[i]为前置和,而x[j]+x[j+1]+...+x[n-1]为后置和.试编写一个程序,求出x[]中有多少组相同的前置和后置和. 例如:x[]的元素是3,6,2,1,4,5,2,于是x[]的前置和有以下7个,即3,9,11,12,16,21,23:后置和则2,7,11,12,14,20,23; 于是11,12,23,

每日一小练——数值自乘非递归解

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:数值自乘非递归解 内容: 连续求m^n问题(m与n是正整数).前面的提示会得到一个递归程序,请编写一个运算效率同样高的非递归的程序. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!如果是非递归其实一种简单的方法就是把, 递归的几种分类做好if分支,用一个循环处理就好了,不过如果我们认真思考m^n这个式子,我们会发现n如果用二进制表示的话如:2^7可改写为 2^011

每日一小练——高速Fibonacci数算法

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: 尝试寻找高速的求出fn的方法 我的解法:上来没多想,打开vs2013就敲了起来,问题果然非常easy,分分钟就超神..奥,不正确就攻克了! 事实上题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,只是由于求解高速方法在递归之前,我编写了一个非递归的算法 #include <iostrea

每日一小练——二项式系数加法解

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:二项式系数加法解 内容:请编写一个程序,仅仅用加法,求出n中取r个组合系数C(n,r),而且尽可能地使加法数目减少. 关于二项式:在数学里,二项式系数,或组合数,是定义为形如(1 + x)的二项式n次幂展开后x的系数(当中n为自然数,k为整数),通常记为.从定义可看出二项式系数的值为整数.这是来自百度的定义.我就不再赘余了. 关于二项式系数我们有一条性质使我们能够使用递归形式: C(n,r)=C(n,r-1)+C(n-

每日一小练——按字典顺序列出所有子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出所有子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的所有子集找出来. 解答: 想必我就不用解释什么是字典顺序了,作为乘虚猿和攻城狮大家应该懂得,不管你懂不懂,反正我懂了! 其实我们可以先列出一个实例,观察规律: 例如n=3 {1} {1,2} {1,2,3} {1,3} {2} {2,3} {3} 可以看出这样的规律(如果你说我怎么没看出来,其实你可以再多看一会!) 令一个指