ACM--数学几何--圆环的转动问题--内蒙古14年省赛

1115: Problem E 圆环的转动问题

时间限制: 1 Sec   内存限制: 128 MB
提交: 58   解决: 6
[ 提交][ 状态][ 讨论版]

题目描述

  已知圆环有如下特性: 1.一个转动着的圆环会带动与其相切的圆环同时转动。 2.两个相切圆环在切点处不会发生滑动。 开始时,平面上有两个静止的圆环(输入数据保证两个圆不会相交或重合)。 后加一外力,使得第一个圆环以角速度W匀速转动。   求此时第二个圆环的角速度。

输入

  输入包含多组数据。 对于每组数据: 第一行有两个整数 : X1,Y1 , R1(第一个圆环的坐标及半径) 第二行有两个整数 : X2,Y2 , R2(第二个圆环的坐标及半径) 第三行有一个整数 : W ( 第一个圆环的角速度 ,负数表示反方向转动 ) X1,Y1,X2,Y2为整数且范围在[0,10^8]内 R1,R2为整数且 0 < R1,R2 < 10^8 W为整数 且 -10^8 < W < 10^8

输出

  请输出第二个圆环的角速度,若不是整数以最简分数形式输出(参见样例)。   每组数据输出一行。

样例输入


0 0 1
2 0 1
-1
0 0 3
5 0 2
1




样例输出

1
-3/2


提示

主要有三种情况:相离:圆心之间的距离大于两个半径之和的距离(小于两个半径之差)

                              外切:圆心之间的距离==两个半径之和的距离  (w2的方向和w1的方向相反)

                              内切:圆心之间的距离==两个半径之差的距离   (w2的方向和w1的方向相同)

还有就是要考虑输出形式的问题:如果可以整除就直接输出;

否则就按最简分数形式输出,(求他们之间的最大公约数,然后再输出)

#include <cstdio>
#include <string>
#include <iostream>
#include <cmath>
typedef long long ll;
using namespace std;
/**
  求最大公约数
*/
ll gcd( ll a,ll b) {
    ll r;
    while(b!=0){
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
/**
  用来进行开平方
*/
ll square(ll x) {
    return x*x;
}
/**
  用来计算坐标上两个点的距离
*/
ll distance(ll x1,ll y1,ll x2,ll y2){
    return square(x1-x2)+square(y1-y2);
}
int main(){
    //第一个圆和第二个圆,角速度
    ll x1,y1,r1,x2,y2,r2,w,v1,temp;
    while(cin>>x1>>y1>>r1>>x2>>y2>>r2>>w){
        v1=w*r1;//求出线速度,两个圆相切,线速度相同
        //求出两点之间的距离
        ll dis=distance(x1,y1,x2,y2);
        if(dis>square(r1+r2) || dis<square(r1-r2) ||w==0)//相离
        {
            printf("0\n");
        }
        //外切
        else if(dis==square(r1+r2)){
            if(w>0) printf("-");
            if(v1%r2==0) printf("%lld\n",(ll)abs(v1)/r2);
            else{
                temp=gcd((ll)abs(v1),r2);
                //除以最大公约数的目的就是获得最简分式
                printf("%lld/%lld\n",(ll)abs(v1)/temp,r2/temp);
            }
        }
        //内切
        else if(dis==square(r1-r2)){
            if(w<0) printf("-");
            if(v1%r2==0) printf("%lld\n",(ll)abs(v1)/r2);
            else{
                temp=gcd((ll)abs(v1),r2);
                //除以最大公约数的目的就是获得最简分式
                printf("%lld/%lld\n",(ll)abs(v1)/temp,r2/temp);
            }
        }
    }
    return 0;
}




参考博客:http://blog.csdn.net/whjkm/article/details/40452833


你可能感兴趣的:(ACM,数学几何,圆环的转动问题,内蒙古14年省赛)