您现在的位置是:首页 > 电脑 > 

2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛) A Chino with Geometry

2025-07-18 18:33:12
2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛) A Chino with Geometry 链接:   题目描述 Chino的数学很差,因此Cocoa非常担心。这一天,Cocoa准备教Chino学习圆与直线的位置关系。 众所周知,直线和圆有三种位置关系:相离、相切、相割,主要根据圆心到直

2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛) A Chino with Geometry

链接:
 

题目描述

Chino的数学很差,因此Cocoa非常担心。这一天,Cocoa准备教Chino学习圆与直线的位置关系。
众所周知,直线和圆有三种位置关系:相离、相切、相割,主要根据圆心到直线的距离来判定。

现在我们来看看作业吧:

是以整点为圆心、正整数为半径的圆,整点分别是圆外一点以及轴上的一点,形成一条圆的割线(也就是和圆有两个交点)。现在Cocoa想要知道,的值是多少?
题目对于Chino来说太难啦,你能帮一帮Chino吗?

输入描述:
六个正整数x0, y0, r, x1, y1, y2
输出描述:
题目要求的答案,精确到整数

示例1

输入

复制

2 2 1  1 2
输出

复制

1
思路:

一开始想的是求出直线与圆的交点的两个坐标,然后直接算出|BD|和|BE|的长度。

这样做需要求出直线和圆的方程然后联立解二元一次方程。

这里参考的另一个博主的给出的方法求得。

链接如下:

求圆和直线相交的两个交点的坐标

代码如下:
#include <bits/stdc.h>
using namespace std;
double x00,y00,r,x11,y11,x22,y22;
double k,b;
double x,y,x44,y44;
double aa,bb,cc;
double re;
double ans;
//求y=kxb中的k和b
void solkb()
{b=y22;k=(y11-y22)/x11;
}
//求圆和直线联立的axbyc=0中的a,b,c
void solabc()
{aa=1k*k;bb=2*k*(b-y00)-2*x00;cc=x00*x00(b-y00)*(b-y00)-r*r;
}
//解二元一次方程
void solxy4()
{re=bb*bb-4*aa*cc;x=(-bbsqrt(re))/(2*aa);x44=(-bb-sqrt(re))/(2*aa);y=k*xb;y44=k*x44b;
}
//根据坐标系求距离
void solve()
{double a1=fabs(y-y11);double b1=fabs(x11-x);double r1=sqrt(a1*a1b1*b1);double a2=fabs(y44-y11);double b2=fabs(x11-x44);double r2=sqrt(a2*a2b2*b2);ans=r1*r2;
}
int main()
{x22=0;scanf(%lf%lf%lf%lf%lf%lf,&x00,&y00,&r,&x11,&y11,&y22);solkb();solabc();solxy4();solve();printf(%.0lf\n,ans);return 0;
}

 

通过看排名大佬提交的代码,发现还有一种更简便的方法:

直接用B到O的距离的平方减去半径的平方就是答案。。。感觉我高中的时候应该知道为什么。。

参考代码如下:
#include<bits/stdc.h>
using namespace std;
typedef long long ll;
int main(){int x0,y0,r,x1,y1,y2;while(EOF!=scanf(%d%d%d%d%d%d,&x0,&y0,&r,&x1,&y1,&y2)){ll a=1ll*(x1-x0)*(x1-x0)1ll*(y1-y0)*(y1-y0);double ans=a-1ll*r*r;printf(%.0lf\n,ans);}return 0;
}

 

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/diannao/880967.html

相关标签:无
上传时间: 2024-04-17 07:12:28
留言与评论(共有 19 条评论)
本站网友 晶石传说
17分钟前 发表
y11
本站网友 内幕交易
16分钟前 发表
ans);}return 0; }  
本站网友 医药资讯网
16分钟前 发表
cc; double re; double ans; //求y=kxb中的k和b void solkb() {b=y22;k=(y11-y22)/x11; } //求圆和直线联立的axbyc=0中的a
本站网友 长期投资
16分钟前 发表
&x0
本站网友 孟雨菲
28分钟前 发表
y1
本站网友 百度提取码
8分钟前 发表
&y22);solkb();solabc();solxy4();solve();printf(%.0lf\n
本站网友 刚需
19分钟前 发表
y1
本站网友 大副的帽子
3分钟前 发表
x1
本站网友 万福家园
24分钟前 发表
x1
本站网友 wna1100驱动
19分钟前 发表
y
本站网友 招商公园1872
10分钟前 发表
&r
本站网友 ca422
9分钟前 发表
y22; double k
本站网友 床虱
8分钟前 发表
y44; double aa
本站网友 治本
12分钟前 发表
相切
本站网友 减肥食谱网
12分钟前 发表
&y00
本站网友 新香洲租房
5分钟前 发表
&y11
本站网友 北京脑瘫医院
26分钟前 发表
y2 输出描述
本站网友 临邑房屋出租
23分钟前 发表
x11