hdu 2136

注解:该题的大意就是每一个合数都可以由两个素数组成,例如4=2+2,5=2+3,要你求出当前数在素数表中的位置。2在第一个位置,5在第三个位置,因为4是合数,则求组成的4的最大素数,4=2+2,5=2+3,则4是第一个位置,5是第三个位置。

这道题,最普通的素数打表,超时。。所以需要一点厉害点的素数筛法。这里贴上一个博客大大的文章素数筛法

然后是代码,首先是一个超时的代码,让我无比尴尬。

#include<iostream>
#include<cstring>

using namespace std;

typedef long long ll;
ll prim[1000005];



int main()
{
	ll i,j,num;
	ll count = 0;
	
	
	memset(prim,0,sizeof(prim));

	prim[1] = 0;
	for(i = 2;i <= 1000000;++i)
	{
		if(!prim[i])
		 {
		 	count++;
		   prim[i] = count;
		for(j = 2*i;j<=1000000;j += i)
		   prim[j] = count;  
	     }
	}
	
	while(cin>>num)
	  cout<<prim[num]<<endl;
	
	
	
	
	return 0;
}
然后是正确代码(没有超时)如下:
#include<stdio.h>
#include<string.h>



typedef long long ll;
ll prim[1000005];



int main()
{
	ll i,j,num;
	ll count = 0;
	
	
	memset(prim,0,sizeof(prim));

	prim[1] = 0;
	for(i = 2;i <= 1000000;++i)
	{
		if(!prim[i])
		 {
		 	count++;
		   prim[i] = count;
		for(j = 2*i;j<=1000000;j += i)
		   prim[j] = count;  
	     }
	}
	
	while(scanf("%d",&num) != EOF)
	  printf("%d\n",prim[num]);
	
	
	
	
	return 0;
}

我要说的是:这两个代码完全一模一样好吗。。第一个是c++的超时,一个是c语言版的过了(345ms)。。我不知道能够说什么。坑。。感觉c++的运行效率好像的确没有c快
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页