P1551 - [蓝桥杯2021初赛] 直线 - New Online Judge (ecustacm.cn)
代码1错误
#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> P;
int n =20,m = 21;
set<P> s1;
void check(int x1,int y1,int x2,int y2){
if(x1==x2||y1==y2)
return;
double k,b;
k=(double)(y2-y1)/(x2-x1);
b = y1-k*x1;
s1.insert({k,b});
}
int main(){
for(int x1=0;x1<n;x1++)
for(int y1=0;y1<m;y1++)
for(int x2=0;x2<n;x2++ )
for(int y2=0;y2<m;y2++)
check(x1,y1,x2,y2);
cout<<s1.size()+n+m;
}
代码2正确
#include<bits/stdc++.h>
using namespace std;
typedef pair<double,double> P;
int n =20,m = 21;
set<P> s1;
void check(int x1,int y1,int x2,int y2){
if(x1==x2||y1==y2)
return;
double k,b;
k=(double)(y2-y1)/(x2-x1);
b = (y1*x2-y2*x1)*1.0/(x2-x1);
s1.insert({k,b});
}
int main(){
for(int x1=0;x1<n;x1++)
for(int y1=0;y1<m;y1++)
for(int x2=0;x2<n;x2++ )
for(int y2=0;y2<m;y2++)
check(x1,y1,x2,y2);
cout<<s1.size()+n+m;
}
只是在b的结果出现了问题
原因:
程序中使用浮点数计算时,由于计算机是二进制数字系统,无法精确地表示所有的十进制浮点数。因此,在做精度要求较高的计算时,可能会出现一定的误差。
在本题中,当我们用
k = (y2 - y1) * 1.0 / (x2 - x1)
来计算斜率k
时,如果(y2 - y1)
和(x2 - x1)
不是十分充分地约分,那么得到的计算结果会存在一定误差。而在使用b = (y1 * x2 - y2 * x1) * 1.0 / (x2 - x1)
来计算截距b
时,如果(y1 * x2 - y2 * x1)
不是十分充分地约分,那么得到的计算结果也会存在一定误差。在本题中,虽然斜率和截距的值可能存在一定误差,但是由于精度要求不高,并且误差相对较小,因此得出的答案仍然是可以接受的,能够满足题目的要求。如果想要更高的精确度,可以考虑使用
Rational
或者Decimal
等高精度计算库来进行计算。