1. 程式人生 > >c++訓練題(求某個數的最大質數因子)兼自己寫的一個列印一定範圍內質數方法

c++訓練題(求某個數的最大質數因子)兼自己寫的一個列印一定範圍內質數方法

題目:Largest prime factor

The prime factors of 13195 are 5 7 13 29, what is the largest prime factor of the number 600851475143?

大概意思是,數13195的質數因子為5 7 13 29,求600851475143的最大質數因子是多少?

首先插點題外話,列印10000以內的質數,分析:1.質數除了2都是奇數,2.自然數只要不被前面小於它開方的質數整除它就是質數。我是用vector向量來儲存資料的,動態的易儲存。

程式碼:

// prime_number.cpp : 定義控制檯應用程式的入口點。
//求1~10000內的質數
//質數除了2都是奇數
//自然數只要不被前面的質數整除它就是質數
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;
bool primeNum(int num, vector<int> vec)
{
	int sq=sqrt(num*1.0);
	vector<int>::iterator iter;
	for(iter=vec.begin(); iter!=vec.end(); iter++)
	{
		if((*iter)<(sq+1))
		{
			if(num%(*iter)==0)
			{
				return false;
			}
		}
		
	}
	return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
	//第一個質數是2
	vector<int> num;
	num.push_back(2);
	bool flag=false;
	for(int i=3; i<10000; i=i+2)
	{
		flag=primeNum(i, num);
		if(flag==true)
		{
			num.push_back(i);
		}
	}
	vector<int>::iterator iter;
	for(iter=num.begin(); iter!=num.end(); iter++)
	{
		cout<<setw(4)<<*iter<<"  ";
	}
	system("pause");
	return 0;
}

結果:


言歸正傳,這個題我首先想的是把質數全部儲存下來,一直儲存到該數開方的位置,然後迴圈質數來被它整除,結果發現運算量太大,放棄了這個想法。後換了個思路,先求出它的因子,然後判斷是不是質數,然後儲存最大的質數因子。

程式碼:

// test0709.cpp : 定義控制檯應用程式的入口點。
//題目:

#include "stdafx.h"
#include  <iostream>
#include <algorithm>
#include <cmath>
#include <vector>

using namespace std;
//如果前面的數不能被整除,就是質數因子
bool prime(vector<long long> vec)
{
	long long num=*(vec.end()-1);
	vec.pop_back();
	vector<long long>::iterator iter;
	for(iter=vec.begin(); iter!=vec.end(); iter++)
	{
		if(num%(*iter)==0)
		{
			return true;
		}
	}
	return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
	long long num=317584931803;
	long sq=sqrt(num*1.0);
	vector<long long> vec;
	for(int i=3; i<(sq+1); i=i+2)
	{//把能整除的奇數結果都儲存在向量中
		if(num%i==0)
		{
			vec.push_back(i);
			vec.push_back(num/i);
		}
	}
	vector<long long>::iterator iter;
	for(iter=vec.begin();iter!=vec.end(); iter++)
	{
		cout<<*iter<<" ";
	}
	cout<<endl;
	//先排序
	sort(vec.begin(),vec.end());//,greater<long long>()
	//從這些結果中篩選質數
	//判斷是否是質數
	bool flag;
	int s=vec.size();
	for(int i=0; i<s; i++)
	{
		flag=prime(vec);
		if(flag==true)
		{
			vec.pop_back();
			continue;
		}
		else
		{
			cout<<*(vec.end()-1)<<endl;
			break;
		}
	}
	system("pause");
	return 0;
}