关于给定较大数(10亿)求质数和的 算法优化问题

1.先给出咱们教材(C语言成绩设计基础)上的案例

#include <iostream>
#define Num 100000
using namespace std;


int main()
{
	int n=Num,k;
	for(int i=2;i<=n;i++)
	{
		for(int j=2;j<=i;j++)
		{
			if(i%j==0 && i!=j) break;
			if(i%j==0 && i==j)k=k+i;
		}
		//cout<<i<<endl;
	}
	cout<<k;

	return 0;
}

我认为这个简直不能叫做算法,这个我真不敢拿10亿来测试,所以就拿下边几组测试一下

100,000 2.442s 值:454396537
500,000 50.89s 值:1324301603
1000,000 1百万我已经不敢测试了 未测试

2.其他思路的启发

看到这个算法感觉真的很强,尤其是进行超大数计算时。

原理就是,看下边一串数字吧,从2开始 把2的倍数全去掉,然后3,把3的倍数全去掉,然后5,5的倍数去掉.....这样能把很多数给清掉

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .....

#include <iostream>
using namespace std;
#define Max_Num 100000

char isPrime[Max_Num+10]; //1为和数   0为质数 
int main(){
	for(int i=1;i<=Max_Num+10;i++)
		isPrime[i]=0; 
	int k=0;	
	for(int i=2;i<=Max_Num;i++)
		if(isPrime[i]==0)
		{k+=i; 
			for(int j=i*2;j<=Max_Num;j+=i)
				isPrime[j]=1;//1的就是 和数 
}
					
	//for(int i=2;i<=Max_Num;i++)
		
	//for(int i=2;i<=Max_Num;i++)
		//if(isPrime[i]==1)cout << i<<" ";
	
	//for(int i=Max_Num;true;i--)
		//if(isPrime[i]==0)
		
	//	{	cout<<i;
	//		break;	} 
	cout << k;
	
	
}

同样放出测试结果

100,000 0.03281s 值:454396537
500,000 0.04388s 值:1324301603
1,000,000 0.05515s 值:3190663655

10,000,000

0.4939s

值超出int范围

100,000,000   4.282s 值超出int范围

当我测试到10,000,000时,前面的质数和已经超出int的范围了,但是计算的结果 我想给大家弄出来。

于是想到一个主意,大家可以把这个超出int范围的思想拓展一下,

首先不能用定义int k;这种变量了    因为这样算出的值 超出范围,会写到下一个(int)内存当中。(有可能)造成程序崩溃,我的处理办法大家可以看一下

注意看详细的备注:

int k[20]={0,0,0,0,0,0,0,0,0,0,0,0,0};
//定义个比较长的数组  来存放这个超出一个 int 范围的值
//超出的值会写入到下一个内存地址
//因为数组的内存是连续的,所以我定义这个较长的数组来存放这个 超大数字

int *p=k;
//定义个指针  指向这个数字的首地址




//初始化数组,令其全部为0

//然后从首地址开始写出
//首地址为p
10,000,000 0.4939s 值:3,574,358,836‬
100,000,000 4.282s 值:‭‭‭6,851,376,204‬
1,000,000,000

47.92s

值:

Ps:做到现在,我现在也怀疑我的方法有问题,因为我用上边方法来看10亿以内的质数和的时候,写入内存的值居然比1亿还小,我目前尚且不知道问题出在哪。也请各位大佬看看我的思路是否有问题,并指点出来

猜你喜欢

转载自blog.csdn.net/O8088/article/details/109911376
今日推荐