题目链接: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; }