FZU 2213 Common Tangents 第六届福建省赛

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2213

题目大意:两个圆,并且知道两个圆的圆心和半径,求这两个圆共同的切线有多少条,若有无数条,输出-1,其他条如数输出

解题思路:这道题只需要判断两圆心的距离与半径的距离即可,代码里面有详细解释

AC代码

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int main()
{
 int t;
 scanf("%d",&t);
 while(t--)
 {
  int ans,x1,y1,r1,x2,y2,r2;
  scanf("%d %d %d %d %d %d",&x1,&y1,&r1,&x2,&y2,&r2);
  if(r1<r2){int temp=r2;r2=r1;r1=temp;;swap(x1,x2);swap(y1,y2);}//第一个为大圆,第二个为小圆
  double d=sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));//两圆心之间的距离
  int rd=abs(r1+r2);//两半径之和
  int rc=abs(r1-r2);//两半径之差
  if(d==0&&r1==r2) ans=-1;//如果两上圆同心,并且一样大,就是有无数条切线
  else
   if(rd<d) ans=4;//半径和小于圆心和,即小圆在大圆外
   else
   if(rd==d) ans=3;//大圆与小圆相外切,有一个交点,小圆在大圆外
    else
    {
    if(d+r2==r1) ans=1;//大圆与小圆相交,小圆在大圆内,有一个交点
    else
     if(d+r2>r1) ans=2;//大圆与小圆相交,有两个交点
     else ans=0;//小圆在大圆里面,且无交点
    }
  printf("%d
",ans);
 }
 return 0;
}
原文地址:https://www.cnblogs.com/www-cnxcy-com/p/5755648.html