由于对于任意一个单独的粘合剂,其组合粘合度就是它本身,即
gcd(ai)=ai,
因此在所有可能的组合中,取单个粘合剂的情况能够达到最大的粘合度。故所有组合中的最大组合粘合度为
max(a1,a2,…,an).
另一方面,对于多个数,其 gcd 具有如下性质:
#include <bits/stdc++.h>
using namespace std;
// 计算两个数的最大公因数
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a);
}
int main() {
int n;
cin >> n; // 读入粘合剂种数
vector<int> a(n); // 存储所有粘合剂的粘合度
int min_gcd = 0, max_gcd = 0;
// 读入粘合剂的粘合度,并计算最小值和最大值
for (int i = 0; i < n; i++) {
cin >> a[i];
min_gcd = gcd(min_gcd, a[i]); // 计算所有粘合剂的最大公因数
max_gcd = max(max_gcd, a[i]); // 计算最大值
}
// 输出最小和最大粘合度
cout << min_gcd << " " << max_gcd << endl;
return 0;
}
import math
# 主函数
def main():
n = int(input()) # 读取粘合剂的数量
a = list(map(int, input().split())) # 读取所有粘合剂的粘合度
min_gcd = a[0]
max_gcd = a[0]
# 遍历所有粘合剂,更新最小值和最大公因数
for i in range(1, n):
min_gcd = math.gcd(min_gcd, a[i])
max_gcd = max(max_gcd, a[i])
# 输出最小和最大粘合度
print(min_gcd, max_gcd)
# 调用主函数
if __name__ == "__main__":
main()
import java.util.*;
public class Main {
// 计算最大公因数
public static int gcd(int a, int b) {
while (b != 0) {
int temp = a;
a = b;
b = temp % b;
}
return a;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 读取粘合剂的数量
int[] a = new int[n];
// 读取所有粘合剂的粘合度
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int min_gcd = a[0];
int max_gcd = a[0];
// 遍历所有粘合剂,更新最小值和最大公因数
for (int i = 1; i < n; i++) {
min_gcd = gcd(min_gcd, a[i]);
max_gcd = Math.max(max_gcd, a[i]);
}
// 输出最小和最大粘合度
System.out.println(min_gcd + " " + max_gcd);
}
}
小红有n种粘合剂,第i种粘合剂的粘合度为a4。 他会从中挑选k(1≤k≤n)种粘合剂组合使用,记桃选的k种粘合剂依次为ab1,ab2...,abk,,那么,组合粘合变为所选粘合剂初始粘合度的最大公因数god(ab1,ab2,..,abk),当k=1时,此时组合粘合度为ab1
现在小红想询问搭配使用粘合剂的最低和最高粘合度为多少?
最大公因数,指两个整数共有约数中最大的一个。例如,12和30的公约数有1,2,3,6,其中最大的约数是6,因此god(12,30)=6。
第一行一个整数n(1≤n≤105),表示粘合剂种数。
第二行n个整数,第i个整数为ai(1≤a≤109),表示第i种粘合剂的粘合度。
两个整数,以空格隔开,分别表示对一个物品任意搭配使用粘合剂的最低和最高粘合度。
输入
3
2 4 6
输出
2 6