时间限制:1000MS 内存限制:256000KB
题目描述
学校每年都会举办运动会,为了开幕式的各方阵能整齐划一,学校规定:每个班的同学,必须被均匀分散到各方阵,使得每个方阵中各班的人数都相同。为了场面的壮观,希望分成的方阵越多越好。你的任务是根据各班的人数,决定最多可分成的方阵。
输入
第一行一个正整数N,代表班级的个数。
接下来有N行,每行为一个正整数,分别代表这N个班级的人数。
输出
输出最多可分成的方阵数。
输入样例 复制
3 12 16 20
输出样例 复制
4 样例解释: 有3 班级个,人数分别为12、16、20,因为12=4×3,16=4×4,20=4×5,所以最多可以分成4个方阵,3个班级在每个队中的人数分别为3人、4人、5人。
今天上午我在电脑室里“wan”画图软件时,我突然“wan”在做这道题时,“wan”出了亿个结论:
在只有一个质数的情况下,一组数的最大公因数=在所有的每两个数的最大公因数中最小的那一个
例如:在 12 24 32 这些数中
(12,24)=12
(12,32)=4 一经对比,我们可以发现,4最小,并且,12,24,32的最小公因数
(24,32)=8 也是“4”!!!!!!!!!!!!!!!!!!!!!!!!
再例如,3 6 9 2(数据一,你敢打表吗??),也是如此。
所以,我们可以通过这个结论来做题,
1,找出所有的最大公因数
2,比较他们的大小
3,输出最小的那个最大公因数
核心代码如下:
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
ahah=zdgys(jojo[i],jojo[j]);//ahah是这一坨数中其中两个的最大公因数
if(ahah<zd)//如果这个最大公因数是最小的,zdgys是一个求最大公因数的函数
zd=ahah;
}
}
#include<bits/stdc++.h>
using namespace std;
int n,a,ans;
int g(int x,int y)
{
int r=x%y;
while(r!=0)
{
x=y;
y=r;
r=x%y;
}
return y;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
ans=g(ans,a);
}
cout<<ans;
return 0;
}