问题描述
小张是软件项目经理,他带领 3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1. 各组的核桃数量必须相同
2. 各组内必须能平分核桃(当然是不能打碎的)
3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)
输入格式
输入包含三个正整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b,c<30)
输出格式
输出一个正整数,表示每袋核桃的数量。
样例输入1
2 4 5
样例输出1
20
样例输入2
3 1 1
样例输出2
3
分析:这道题其实就是求三个数的最小公倍数,那么问题就归结到怎样求最小公倍数(https://www.yxfseo.cn/post-213.html)了,方法有很多。
求三个数的最小公倍数可以先求两个数的最小公倍数。
源代码1:
#include
int gcd(int a,int b);
int lcm(int a,int b);
int main()
{
int a,b,c,n;
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",lcm(lcm(a,b),c));
return 0;
}
//最大公约数(a,b) 辗转相除法
int gcd(int a,int b)
{
return a%b?gcd(b,a%b):b;
}
//最小公倍数[a,b] a*b = (a,b)[a,b]
int lcm(int a,int b)
{
return (a*b)/gcd(a,b);
}
源代码2:
#include
int gcd(int a,int b);
int lcm(int a,int b);
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",lcm(lcm(a,b),c));
return 0;
}
//最大公约数(a,b) 相减法
int gcd(int a,int b)
{
int m = a, n = b;
while(a!=b){
if(a>b)a = a - b;
elseb = b - a;
}
return a;
}
//最小公倍数[a,b] a*b = (a,b)[a,b]
int lcm(int a,int b)
{
return (a*b)/gcd(a,b);
}
源代码3:
#include
int max(int a,int b, int c);
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int m = max(a,b,c);
/*求最小公倍数,最大的数开始往上加*/
while((m%a!=0)||(m%b!=0)||(m%c!=0))
m++;
printf("%d\n",m);
return 0;
}
//求三个数最大值
int max(int a,int b, int c)
{
return (a>b?(a>c?a:c):(b>c?b:c));
}
源代码4:短除法:先求三个数的因数,再做乘积,就是最小公倍数。
#include
int max(int a,int b, int c);
int main()
{
int a,b,c,ans = 1,i,flag;
scanf("%d%d%d",&a,&b,&c);
int m = max(a,b,c);
for(i=2; i<=m; i++){
flag = 1;
while(flag){
flag = 0;
//找他们的因数
if(a%i==0){
a = a/i;
flag = 1;
}
if(b%i==0){
b = b/i;
flag = 1;
}
if(c%i==0){
c = c/i;
flag = 1;
}
if(flag == 1)ans*=i;//因数求积
m = max(a,b,c);
}
}
printf("%d\n",ans);
return 0;
}
//求三个数最大值
int max(int a,int b, int c)
{
return (a>b?(a>c?a:c):(b>c?b:c));
}