zoukankan      html  css  js  c++  java
  • 素/质数输出两种算法的比较

    前两天在网上看到一种判断素数的方法(筛选法),跟平时老师讲的不太一样,于是亲手尝试了一下,果然,计算速度有很大差别!(前提是运算的数据很多,本文以1000000以内的素数为例!)

    ·普通方法

    我们平时用的方法一般是拿到一个数(如17),然后从2开始去除17,若直到与17差1而余数仍不为零,则是素数。然后再细想其实没必要算到比17小1,而只要算到√17即可,因为17/√17=√17,再继续算的话,即使能除尽,结果也肯定是2~√17中的一个数,而这个数早已计算过。所以我们就可以限制除数从2~√17,当然在计算过程中,√17要取整。代码如下:
    #include <iostream>
    #include<fstream>
    #include<ctime>
    using namespace std;
    #define MAX_NUM 1000000
    int IsPrime[MAX_NUM + 10];
    int main() {
    	int a = 0;
    	int i, j;
    	clock_t start_time,end_time;//计算程序运行时间
    	start_time = clock();
    	for (i = 2;i<=MAX_NUM;i++) {
    		IsPrime[i] = 1;//将1000000个数据在数组内的值赋成1
    	}
    	for (i = 2;i <= MAX_NUM;i++) {
    		for (j = 2;j <= (int)sqrt(i);j++) {
    			if (i%j == 0) {
    				IsPrime[i] = 0;
    				continue;
    			}
    		}
    	}
    	end_time = clock();
    	ofstream file;
    	file.open("sushu.txt");
    	file <<"素数输出:"<< endl;
    	for (i = 2;i <= MAX_NUM;i++) {
    		if (IsPrime[i] == 1)
    		{
    			file << i << " ";a++;//输出数组内值为一对应的i值,即为素数,a用于记录素数个数
    		}
    	}
    	file << endl;
    	file << "----------------------------------" << endl;
    	file << "1000000以内的质数共有" << a << "个!" << endl;
    	file << "----------------------------------" << endl;
    	file.close();
    	cout << "此算法运行时间为:" << end_time - start_time << "ms" << endl;
    	cout << "结果已写入文件!" << endl;
    	return 0;
    }
    

    ·筛选法

    筛选法是指从2开始,依次找出其倍数并将其数组值置零,然后一直循环下去,直到将所有有因数的数据筛除。代码如下:
    #include <iostream>
    #include<fstream>
    #include<ctime>
    using namespace std;
    #define MAX_NUM 1000000
    int IsPrime[MAX_NUM + 10];
    int main() {
    	int a = 0;
    	int i, j;
    	clock_t start_time,end_time;//计算程序运行时间
    	start_time = clock();
    	for (i = 2;i<=MAX_NUM;i++) {
    		IsPrime[i] = 1;//将1000000个数据在数组内的值赋成1
    	}
    	for (i = 2;i<=MAX_NUM;i++) {
    		if (IsPrime[i]==1) {
    			for (j = 2 * i;j <= MAX_NUM;j += i) {
    				IsPrime[j] = 0;//从2开始,依次找出其倍数并将数组值置零
    			}
    		}
    	}
    	end_time = clock();
    	ofstream file;
    	file.open("sushu.txt",ios::out||ios::app);
    	file <<"素数输出:"<< endl;
    	for (i = 2;i <= MAX_NUM;i++) {
    		if (IsPrime[i] == 1)
    		{
    			file << i << " ";a++;//输出数组内值为一对应的i值,即为素数,a用于记录素数个数
    		}
    	}
    	file << endl;
    	file << "----------------------------------" << endl;
    	file << "1000000以内的质数共有" << a << "个!" << endl;
    	file << "----------------------------------" << endl;
    	file.close();
    	cout << "此算法运行时间为:" << end_time - start_time << "ms" << endl;
    	cout << "结果已写入文件!" << endl;
    	return 0;
    }
    

    运行结果:

    由此可见,算法的好坏对有大量数据的计算有很大的影响,当然1000000对计算机每天要处理的东西来说还不算大,那么如果更大又会有什么后果呢。可往往越重要的东西就越不简单,即使说学了算法与数据结构,但还是觉得对算法才掌握了一点点皮毛。所以,让我们一起好好学习算法吧!
  • 相关阅读:
    AngularJS 拦截器
    android的Log日志打印管理工具类(一)
    android的Home键的监听封装工具类(一)
    android开发SDcard 响应的文件相关处理(一)
    android开发时间和日期的代码实现工具类(一)
    android文件和图片的处理工具类(一)
    android的二进制和十六进制的相互转换工具类(一):
    android的color整理(一)
    android经典Demo(转载)
    Android 根据EditText搜索框ListView动态显示数据
  • 原文地址:https://www.cnblogs.com/eternal-pig/p/C_one.html
Copyright © 2011-2022 走看看