51nod 1179 最大的最大公约数
来源:互联网 发布:清华大学有网络教育吗 编辑:程序博客网 时间:2024/04/29 19:40
1179 最大的最大公约数
题目来源: SGU
基准时间限制: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示例
4
9
15
25
16
Output示例
5
题解:
两个数的公约数说明两个数都含有这个约数,我们可以利用这个性质。打一个约数表,从最大的约数开始往前枚举,碰到约数个数大于等于2,直接输出即可。
以下是自己的代码:
代码:
#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL maxn = 1000000+10;int cnt[maxn];void solve(LL num){ LL d = sqrt(num); for(int i=1;i<=d;i++) if(num%i==0) {cnt[i]++;cnt[num/i]++;}}int main(){ int N; cin>>N; LL tmp; LL M=-(1<<30); for(int i=0;i<N;i++) { cin>>tmp; solve(tmp); M=max(M,tmp); } for(int i=M;i>=1;i--) if(cnt[i]>=2) {cout<<i<<endl;break;} return 0;}
参考大佬的代码:筛法
#include <stdio.h> #include <string.h> #define maxn 1000000+10 int num[maxn]; int book[maxn]; int n,m; int main() { while(~scanf("%d",&n)) { memset(num,0,sizeof(num)); int max1=0,ans,k=1; for(int i=0; i<n; i++) { scanf("%d",&m); book[m]++; if(m>max1) max1=m; } for(int i=max1; i>=1; i--) { ans=0; for(int j=i; j<=max1; j+=i) { ans+=book[j]; if(ans>=2) { k=i; break; } } if(ans>=2) break; } printf("%d\n",k); } return 0; }
阅读全文
0 0
- 51nod 1179:最大的最大公约数
- 51nod-1179-最大的最大公约数
- 51NOD 1179 最大的最大公约数
- 51nod:1179 最大的最大公约数
- 51nod-1179 最大的最大公约数
- 51nod 1179 最大的最大公约数
- 51nod 1179 最大的最大公约数
- 51Nod 1179 最大的最大公约数
- 51Nod-1179 最大的最大公约数【暴力】
- 51nod 1179 最大的最大公约数
- 51Nod 1179 最大的最大公约数
- 51nod 1179 最大的最大公约数
- 51nod 1179 最大的最大公约数
- 51nod 1179 最大的最大公约数 -Zero
- 51nod 1179 最大的最大公约数
- 51Nod 1179 最大的最大公约数
- 51nod-1179-最大的最大公约数
- 51nod 1179 最大的最大公约数
- 高精度减法入门详解
- Oracle数据库基础(三)
- [编程题] 构造队列
- poj 3273 二分枚举
- Java——Java集合Set
- 51nod 1179 最大的最大公约数
- Node.js方法错误自动重试的实现
- C/C++堆栈
- 使用FormData来提交表单同时上传文件到服务端
- String类和包装类
- 精品微信小程序源码demo推荐-仿饿了么点餐
- MySQL 存储过程 : procedure
- 最小的K个数
- 编译openwrt时报错 Permissions for installing coreutils with pkgsrc on NetBSD