ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

试题 算法训练 最大质因数

2021-01-25 13:30:22  阅读:198  来源: 互联网

标签:试题 int flag 算法 质因数 find dp 最大


资源限制
时间限制:1.0s 内存限制:256.0MB


问题描述
  给出N个数字,求出有最大的最大质因数的那个数


输入格式
  第一行:一个整数N。
  接下来的N行,每行一个整数A_i,表示给出的那N个数字。输出格式
  第一行:一个整数,拥有最大的最大质因数的那个数。


样例输入
4
36
38
40
42
样例输出
38


数据规模和约定
  60%的数据满足:N<=100
  100%的数据满足:N<=2500,A_i<=20000


前言:

该题目是BASIC-16分解质因数的提高,有异曲同工之妙,方法还是对容器的使用,容器使用得当,可以大大提高时间效率,用起来比较方便。对分解质因数不了解的可以去本人上篇博文:试题 基础练习 分解质因数,网址:https://blog.csdn.net/weixin_49243150/article/details/113098201

解题方法:

  • 在分解质因数的基础上,已经获得了N的质因数,并存入了容器,只需要在声明一个容器,用来存储每个N的最大质因数。
  • 由于该容器有自动排序的功能(默认升序),然后就可以找到最大的质因数,然后找到对应的N即可

源代码:

#include<iostream>
#include<math.h>
#include<set>
using namespace std;
set<int>m;//找到N的质因数
multiset<int>q;//存储每一个N的最大的质因数
void find(int n)// 依旧是那个find()函数,只是改成set,可以去重复值,不变其实也可以。It's up to you
{
   int flag = 0;
   for (int i = 2; i <= sqrt(n); i++)
   {
   	if (n % i == 0)
   	{
   		flag = 1;
   		m.insert(i);
   		if (n / i != i)
   		{
   			find(n / i);
   			break;//!!!
   		}
   		if (n / i == i)
   		{
   			m.insert(i);
   		}
   	}
   }
   if (flag == 0)
   	m.insert(n);
}
void Fmax(int n)//找最大的质因数。
{
   int flag;
   int a[2500];
   int dp[2500];
   for (int i = 0; i < n; i++)//输入N个数
   {
   	cin >> a[i];
   	find(a[i]);//对应每个N的质因数
   	set<int>::iterator p = m.end();//声明直接指向最后一个元素的迭代器
   	q.insert(*(--p));//注意要是*(--p)对应着最后一个元素
   	dp[i] = *(p);//把某数N的最大质因数存入数组dp中
   	m.clear();
   }
   multiset<int>::iterator p = q.end();
   int x = *(--p);//此时x的值为所有数据中的最大的质因数
   for (int i = 0; i < n; i++)
   {
   	if (dp[i] == x)
   	{
   		flag = i;
   		break;
   	}
   }
   cout << a[flag] << endl;//输出对应的N
}
int main()
{
   int n;
   cin >> n;
   Fmax(n);
}

运行结果:

在这里插入图片描述

评测结果:

在这里插入图片描述
在这里插入图片描述

标签:试题,int,flag,算法,质因数,find,dp,最大
来源: https://blog.csdn.net/weixin_49243150/article/details/113108103

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有