本文主要是介绍SP2901 GEOPROB - One Geometry Problem 题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SP2901 GEOPROB - One Geometry Problem 题解
什么小学几何题。
解法
小学三年级学的构造弦图,容易得到线图中四个三角形都全等。如图。
a = c − d + d − b + c − d = 2 c − b − d \begin{aligned}a & = c-d+d-b+c-d \\ & = 2c-b-d\end{aligned} a=c−d+d−b+c−d=2c−b−d
证明都在图里了,这里不再多说。
顺带一提,本题要写高精度,这里给部分封装过的模板,开封即用。
class high_accuracy
{
private:int len,a[210];
public:high_accuracy(){len=0,memset(a,0,sizeof(a));}inline void clear(){len=0,memset(a,0,sizeof(a));}inline int &operator[](const int x){return a[x];}inline int size(){return len;}inline void init(__int128 x){len=0,memset(a,0,sizeof(a));if(x==0) len=1;while(x) a[++len]=x%10,x/=10;}inline void input(){std::string st;std::cin>>st,len=0,memset(a,0,sizeof(a));for(int i=st.size()-1;i>=0;i--) a[++len]=st[i]^48;}inline void deal(int l){for(int i=1;i<=l;i++) a[i+1]+=a[i]/10,a[i]%=10;len=l;for(int i=1;i<=l;i++) if(a[i]<0) a[i+1]-=(abs(a[i])-1)/10+1,a[i]+=((abs(a[i])-1)/10+1)*10;while(!a[len]) len--;}inline void print(){for(int i=std::max(len,1);i;i--) std::cout<<a[i];}inline high_accuracy operator+(high_accuracy rhs){high_accuracy ret;int le=std::max(len,rhs.size());for(int i=1;i<=le;i++) ret[i]+=a[i]+rhs[i],ret[i+1]=ret[i]/10,ret[i]%=10;ret.deal(le+2);return ret;}inline high_accuracy operator-(high_accuracy rhs) // 适用于 *this 比 rhs 大的情况{high_accuracy ret;int le=std::max(len,rhs.size());for(int i=1;i<=le+3;i++) ret[i]=0;for(int i=1;i<=le;i++) ret[i]+=a[i]-rhs[i];ret.deal(le+2);return ret;}
};
代码
#include<bits/stdc++.h>
int n;
class high_accuracy
{/*** 封装内容如上*/
};
high_accuracy a,b,c,d;
int main()
{std::cin>>n;while(n--) b.input(),c.input(),d.input(),a.clear(),a=c+c-b-d,a.print(),std::cout<<'\n';return 0;
}
这篇关于SP2901 GEOPROB - One Geometry Problem 题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!