Google 2013校招笔试题:前N个素数

5 篇文章 0 订阅
4 篇文章 0 订阅

题:给N,输出前N个素数

素数:除了2都是偶数。

验证N是素数:2-N的开方与N最大公约数是1。

假设已知前K个素数,第K+1个素数与已知素数求最大公约数。


上代码——C++好久不写,弄了我好久:

头文件:

#ifndef PRIME_HOLDER_H
#define PRIME_HOLDER_H

#include <vector>

using std::vector;

class PrimeHolder{
 public:
  void print_prime(int N);
  PrimeHolder();
  void reset(void);
  virtual ~PrimeHolder();
 private:
  vector<int> primeList;
  int gcd(int x, int y);
  void printN(int num);
};
#endif


定义:

#include <iostream>
#include <cmath>
#include "printprime.h"

using namespace std;

PrimeHolder::PrimeHolder(){
	primeList.push_back(2);
	primeList.push_back(3);
	primeList.push_back(5);
	primeList.push_back(7);
	primeList.push_back(11);
	primeList.push_back(13);
	primeList.push_back(17);
	primeList.push_back(19);
}

PrimeHolder::~PrimeHolder(){
}

void PrimeHolder::reset(void){
	primeList.clear();
	primeList.push_back(2);
	primeList.push_back(3);
	primeList.push_back(5);
	primeList.push_back(7);
	primeList.push_back(11);
	primeList.push_back(13);
	primeList.push_back(17);
	primeList.push_back(19);
}

int PrimeHolder::gcd(int x, int y){
	if (y==0) return x;
	else return gcd(y, x%y);
}

void PrimeHolder::printN(int num){
	int i = 0;
	for(vector<int>::iterator iter = primeList.begin(); i < num; ++iter, ++i)
		cout << *iter << " ";
	cout << endl;
}

void PrimeHolder::print_prime(int N){
	if (N < primeList.size())
		printN(N);
	else {
		int start = primeList.back() + 1;
		while (primeList.size() < N){

			bool tag = true;
			int max = sqrt((double)start);
			
			for (vector<int>::iterator iter = primeList.begin(); *iter<max; iter++){
				if (gcd(start, *iter)!=1) {
					tag = false;
					break;
				}
			}    
			if (tag) {
				primeList.push_back(start);
				start++;
			}
			else 
				start++;
		}
		printN(N);
	}
}



#include <ctime>
#include <iostream>
#include <vector>
#include "primeholder.h"

using namespace std;

int main(){
  PrimeHolder ph;
  clock_t start, finish;
  
  vector<double> times;
  

  start = clock();
  ph.print_prime(100);
  finish = clock();
  times.push_back((double)(finish-start)/CLOCKS_PER_SEC);
  ph.reset();

  start = clock();
  ph.print_prime(1000);
  finish = clock();
  times.push_back((double)(finish-start)/CLOCKS_PER_SEC);
  ph.reset();

  start = clock();
  ph.print_prime(10000);
  finish = clock();
  times.push_back((double)(finish-start)/CLOCKS_PER_SEC);
  ph.reset();

  start = clock();
  ph.print_prime(100000);
  finish = clock();
  times.push_back((double)(finish-start)/CLOCKS_PER_SEC);

  // no reset
  start = clock();
  ph.print_prime(1000000);
  finish = clock();
  times.push_back((double)(finish-start)/CLOCKS_PER_SEC);
  
  for(vector<double>::iterator iter = times.begin(); iter != times.end(); iter++)
    cout << *iter << " " ;
  cout << endl; 
}


唔,N=100000时要超过1s,1000000时要几分钟,求各位巨巨指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值