c++訓練題(求某個數的最大質數因子)兼自己寫的一個列印一定範圍內質數方法
阿新 • • 發佈:2019-01-04
題目: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; }