关闭

c++训练题(求某个数的最大质数因子)兼自己写的一个打印一定范围内质数方法

859人阅读 评论(0) 收藏 举报
分类:

题目: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;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:54643次
    • 积分:1220
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:7篇
    • 译文:0篇
    • 评论:15条
    最新评论