博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod-1179 最大的最大公约数【暴力】
阅读量:6830 次
发布时间:2019-06-26

本文共 1155 字,大约阅读时间需要 3 分钟。

基准时间限制:1 秒 空间限制:131072 KB 分值: 40
难度:4级算法题
给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
Input
第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000)第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
Output
输出两两之间最大公约数的最大值。
Input示例
49152516
Output示例
5

问题链接

问题分析

按照题意,对于给定的整数两两求其最大公约数是一种暴力,然而时间上不可接受,因为其计算复杂度是O(n*n)。

换一种暴力也许计算复杂度会有所降低,不会随着N的增大而增大。这就是从最大的s[i]<=1000000开始试探,逐步减小找到最大的最大公约数。

上述过程中,主要是看各个数的倍数(包括倍数为1的)是否与之相等,有两个相等的则找到了所求的答案。

程序说明:(略)

题记:两权相害取其轻。

参考链接:(略)

AC的C++程序如下:

#include 
#include
#include
using namespace std;const int N = 1000000;int siflag[N+1];int main(){ int n, i, si, maxsi; memset(siflag, 0, sizeof(siflag)); scanf("%d", &n); maxsi = 0; for(i=1; i<=n; i++) { scanf("%d", &si); siflag[si]++; maxsi = max(maxsi, si); } for(i=maxsi; i>=1; i--) { int count = 0; for(int j=i; j<=maxsi; j+=i) { count += siflag[j]; if(count >= 2) break; } if(count >= 2) break; } printf("%d\n", i); return 0;}

转载于:https://www.cnblogs.com/tigerisland/p/7563725.html

你可能感兴趣的文章
《QQ欢乐斗地主》山寨版
查看>>
病毒木马查杀实战第015篇:U盘病毒之脱壳研究
查看>>
SDK是什么?什么是SDK
查看>>
centos/linux下的使得maven/tomcat能在普通用户是使用
查看>>
Web学习篇之---html基础知识(一)
查看>>
java多线程入门学习(一)
查看>>
canvas图形处理和进阶用法
查看>>
1. 请问PHP里的ECHO是什么意思 ?请问PHP里的ECHO是什么意思???有什么作用???又应该怎么使用???...
查看>>
ES6,数组遍历
查看>>
如何把浏览器不信任的网址设置为可信任的网点
查看>>
脚本加密http://www.datsi.fi.upm.es/~frosal/sources/
查看>>
Cocos Studio is EOL'd
查看>>
linux shell下16进制 “\uxxxx” unicode to UTF-8中文
查看>>
【WPF】树形结构TreeView的用法(MVVM)
查看>>
Go -- 读取文件内容
查看>>
cURL介绍
查看>>
css样式布局中position的那些事儿
查看>>
mysql慢查询日志相关参数
查看>>
项目中如果管理前端文件CSS和JS
查看>>
13 jsp include
查看>>