文章

直线(2021省赛)

直线.png

转换成double会精度缺失,用整数存储(注意最后+20,因为有竖直线的表达式相同了!!!!!)

#include<bits/stdc++.h>
using namespace std;
set<string >st;
int gcd(int a,int b){//辗转相除法 
    int r;//余数 
    while(b!=0){
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
string str(int x){//把整数变成字符串 
    string s;
    if(x==0) return "0";
    int flag=0;
    if(x<0){
        flag=1;
        x=abs(x);
    }
    while(x!=0){
        s+=char(x%10+'0');
        x/=10;
    }
    if(flag==1){
        s+='-';
    }
    reverse(s.begin(),s.end());
    return s;
}
​
int main()
{
    int n=21,m=20,k,b,x1,x2,y1,y2,k1,k2,b1,b2,gcdd;
    for(x1=0;x1<n;x1++){
        for(y1=0;y1<m;y1++){
            for(x2=0;x2<n;x2++){
                for(y2=0;y2<m;y2++){
                    if(x1==x2&&y1==y2) continue;//同一个不用计算
                    if(x1==x2) {//斜率为无穷 
                        k1=300000;
                        k2=1;
                    }else {
                        if(y1==y2){//斜率为0 
                            k1=0;
                            k2=1;
                        }else {
                            k1=y2-y1;
                            k2=x2-x1;
                            gcdd=gcd(abs(k1),abs(k2));//公约数 
                            k1=k1/gcdd;
                            k2=k2/gcdd;
                            if(k1*k2<0){//规范前一个取负数,后一个正数 
                                k1=-abs(k1);
                                k2=abs(k2);
                            }else {
                                k1=abs(k1);
                                k2=abs(k2);
                            }
                        }
                    }
                    if(y1==y2){//截距为y 
                        b1=y1;
                        b2=1;
                    } else {
                        if(x1==x2){//没有截距 
                            b1=300000;
                            b2=1;
                        }else {
                            b1=x2*y1-x1*y2;
                            b2=x2-x1;
                            gcdd=gcd(abs(b1),abs(b2));//公约数 
                            b1=b1/gcdd;
                            b2=b2/gcdd;
                            if(b1*b2<0){//规范前一个取负数,后一个正数 
                                b1=-abs(b1);
                                b2=abs(b2);
                            }else {
                                b1=abs(b1);
                                b2=abs(b2);
                            }
                        }
                    }
                    st.insert(str(k1)+' '+str(k2)+' '+str(b1)+' '+str(b2));
//                    cout<<"now "<<x1<<' '<<y1<<' '<<x2<<' '<<y2<<"结果";
//                    cout<<str(k1)+' '+str(k2)+' '+str(b1)+' '+str(b2)<<endl;
                }
            }
        }
    }
    cout<<st.size()+20<<endl;//k等于无穷和无截距的数值重复了!!!!!!!!!!!!!!! 
    return 0;
 }

原题链接

https://www.lanqiao.cn/problems/1449/learning/

License:  CC BY 4.0