三齿轮问题:三个齿轮啮合

来源:互联网 发布:淘宝首页在线制作 编辑:程序博客网 时间:2024/06/09 23:44

描述

如图在齿轮箱里三个齿轮互相衔接,某瞬间两对齿相遇,问各转多少圈后,这两对齿同时重逢。

输入

输入数据有多组,每组数据一行,每行为3个数a,b,c,分别代表三个齿轮的齿数(均为正整数)。数与数之间用空格隔开。当a,b,c中有一个为0时,输入结束。

输出

输出每组数据中,每个齿轮所转的圈数,用空格隔开。

样例输入

1 1 1
2 2 2
0 0 0

样例输出

1 1 1
1 1 1
方法1:#include<iostream>#include<cstdio>#include<string.h>#include<queue>#include<algorithm>#include<cmath>using namespace std;int max_public_num(int s1,int s2){    if(s1<s2){        int tem = s1;        s1=s2;        s2=tem;    }    while(s1%s2==0)    {        return s2;    }    return max_public_num(s2,s1%s2);}int min_public_num(int t1,int t2){  return t1*t2/max_public_num(t1,t2);}int main(){    int a,b,c;    while(scanf("%d %d %d",&a,&b,&c))    {        if((a==0)||(b==0)||(c==0))        break;       int num=min_public_num((a,b),c);       printf("%d %d %d\n",num/a,num/b,num/c);    }    return 0;}方法2:#include <iostream>#include <cmath>#include <algorithm>using namespace std;int main(){    int a[3],b[3];   // int x,y,z;    int k,s,i;    while(cin>>a[0]>>a[1]>>a[2])    {        b[0]=a[0];b[1]=a[1];b[2]=a[2];        if(a[0]==0 || a[1]==0 || a[2]==0)        {break;}      sort(a,a+3);      s=a[0]*a[1]*a[2];      k=a[2];      for(i=k;i<s;i++)      {          if(i%a[0]==0 && i%a[1]==0 && i%a[2]==0)            break;      }      cout<<i/b[0]<<' '<<i/b[1]<<' '<<i/b[2]<<endl;    }    return 0;}  
这道题初看起来没有头绪,但是只要好好想想就知道了,其实就是求三个数的最小公约数,三个齿轮的个数其实就是那个齿轮的周长,要三个齿轮再次相遇,也就是求三个数的最小公约数,只要想明白了这一点这道题就很容易了,
我用了两种方法来求,第一种是递归,先求出两个数的最小公约数,再两两相求,第二种就是直接求,找到三个数中最大的一个和这三个数的乘积,作为for循环的边界,依次枚举,找到最小公约数。
原创粉丝点击