HDU 6206 Apple(高精度C++)
来源:互联网 发布:沙发品牌 知乎 编辑:程序博客网 时间:2024/06/11 06:21
题意:给你三个点,保证不再同一条直线上,再给你一点,问你是否在这三个点形成的圆外。
思路:就是求出三个点外接圆的圆心和半径判断下。
已知三点坐标,求外接圆圆心坐标与半径。
#include<string>#include<iostream>#include<iosfwd>#include<cmath>#include<cstring>#include<stdlib.h>#include<stdio.h>#include<cstring>#define MAX_L 2005 //最大长度,可以修改using namespace std;#define max_n 100000000//因为结果可能不是整数,把小数部分去掉class bign{public: int len, s[MAX_L];//数的长度,记录数组//构造函数 bign(); bign(const char*); bign(int); bool sign;//符号 1正数 0负数 string toStr() const;//转化为字符串,主要是便于输出 friend istream& operator>>(istream &,bign &);//重载输入流 friend ostream& operator<<(ostream &,bign &);//重载输出流//重载复制 bign operator=(const char*); bign operator=(int); bign operator=(const string);//重载各种比较 bool operator>(const bign &) const; bool operator>=(const bign &) const; bool operator<(const bign &) const; bool operator<=(const bign &) const; bool operator==(const bign &) const; bool operator!=(const bign &) const;//重载四则运算 bign operator+(const bign &) const; bign operator++(); bign operator++(int); bign operator+=(const bign&); bign operator-(const bign &) const; bign operator--(); bign operator--(int); bign operator-=(const bign&); bign operator*(const bign &)const; bign operator*(const int num)const; bign operator*=(const bign&); bign operator/(const bign&)const; bign operator/=(const bign&);//四则运算的衍生运算 bign operator%(const bign&)const;//取模(余数) bign factorial()const;//阶乘 bign Sqrt()const;//整数开根(向下取整) bign pow(const bign&)const;//次方//一些乱乱的函数 void clean(); ~bign();};#define max(a,b) a>b ? a : b#define min(a,b) a<b ? a : bbign::bign(){ memset(s, 0, sizeof(s)); len = 1; sign = 1;}bign::bign(const char *num){ *this = num;}bign::bign(int num){ *this = num;}string bign::toStr() const{ string res; res = ""; for (int i = 0; i < len; i++) res = (char)(s[i] + '0') + res; if (res == "") res = "0"; if (!sign&&res != "0") res = "-" + res; return res;}istream &operator>>(istream &in, bign &num){ string str; in>>str; num=str; return in;}ostream &operator<<(ostream &out, bign &num){ out<<num.toStr(); return out;}bign bign::operator=(const char *num){ memset(s, 0, sizeof(s)); char a[MAX_L] = ""; if (num[0] != '-') strcpy(a, num); else for (int i = 1; i < strlen(num); i++) a[i - 1] = num[i]; sign = !(num[0] == '-'); len = strlen(a); for (int i = 0; i < strlen(a); i++) s[i] = a[len - i - 1] - 48; return *this;}bign bign::operator=(int num){ char temp[MAX_L]; sprintf(temp, "%d", num); *this = temp; return *this;}bign bign::operator=(const string num){ const char *tmp; tmp = num.c_str(); *this = tmp; return *this;}bool bign::operator<(const bign &num) const{ if (sign^num.sign) return num.sign; if (len != num.len) return len < num.len; for (int i = len - 1; i >= 0; i--) if (s[i] != num.s[i]) return sign ? (s[i] < num.s[i]) : (!(s[i] < num.s[i])); return !sign;}bool bign::operator>(const bign&num)const{ return num < *this;}bool bign::operator<=(const bign&num)const{ return !(*this>num);}bool bign::operator>=(const bign&num)const{ return !(*this<num);}bool bign::operator!=(const bign&num)const{ return *this > num || *this < num;}bool bign::operator==(const bign&num)const{ return !(num != *this);}bign bign::operator+(const bign &num) const{ if (sign^num.sign) { bign tmp = sign ? num : *this; tmp.sign = 1; return sign ? *this - tmp : num - tmp; } bign result; result.len = 0; int temp = 0; for (int i = 0; temp || i < (max(len, num.len)); i++) { int t = s[i] + num.s[i] + temp; result.s[result.len++] = t % 10; temp = t / 10; } result.sign = sign; return result;}bign bign::operator++(){ *this = *this + 1; return *this;}bign bign::operator++(int){ bign old = *this; ++(*this); return old;}bign bign::operator+=(const bign &num){ *this = *this + num; return *this;}bign bign::operator-(const bign &num) const{ bign b=num,a=*this; if (!num.sign && !sign) { b.sign=1; a.sign=1; return b-a; } if (!b.sign) { b.sign=1; return a+b; } if (!a.sign) { a.sign=1; b=bign(0)-(a+b); return b; } if (a<b) { bign c=(b-a); c.sign=false; return c; } bign result; result.len = 0; for (int i = 0, g = 0; i < a.len; i++) { int x = a.s[i] - g; if (i < b.len) x -= b.s[i]; if (x >= 0) g = 0; else { g = 1; x += 10; } result.s[result.len++] = x; } result.clean(); return result;}bign bign::operator * (const bign &num)const{ bign result; result.len = len + num.len; for (int i = 0; i < len; i++) for (int j = 0; j < num.len; j++) result.s[i + j] += s[i] * num.s[j]; for (int i = 0; i < result.len; i++) { result.s[i + 1] += result.s[i] / 10; result.s[i] %= 10; } result.clean(); result.sign = !(sign^num.sign); return result;}bign bign::operator*(const int num)const{ bign x = num; bign z = *this; return x*z;}bign bign::operator*=(const bign&num){ *this = *this * num; return *this;}bign bign::operator /(const bign&num)const{ bign ans; ans.len = len - num.len + 1; if (ans.len < 0) { ans.len = 1; return ans; } bign divisor = *this, divid = num; divisor.sign = divid.sign = 1; int k = ans.len - 1; int j = len - 1; while (k >= 0) { while (divisor.s[j] == 0) j--; if (k > j) k = j; char z[MAX_L]; memset(z, 0, sizeof(z)); for (int i = j; i >= k; i--) z[j - i] = divisor.s[i] + '0'; bign dividend = z; if (dividend < divid) { k--; continue; } int key = 0; while (divid*key <= dividend) key++; key--; ans.s[k] = key; bign temp = divid*key; for (int i = 0; i < k; i++) temp = temp * 10; divisor = divisor - temp; k--; } ans.clean(); ans.sign = !(sign^num.sign); return ans;}bign bign::operator/=(const bign&num){ *this = *this / num; return *this;}bign bign::operator%(const bign& num)const{ bign a = *this, b = num; a.sign = b.sign = 1; bign result, temp = a / b*b; result = a - temp; result.sign = sign; return result;}bign bign::pow(const bign& num)const{ bign result = 1; for (bign i = 0; i < num; i++) result = result*(*this); return result;}bign bign::factorial()const{ bign result = 1; for (bign i = 1; i <= *this; i++) result *= i; return result;}void bign::clean(){ if (len == 0) len++; while (len > 1 && s[len - 1] == '\0') len--;}bign bign::Sqrt()const{ if(*this<0)return -1; if(*this<=1)return *this; bign l=0,r=*this,mid; while(r-l>1) { mid=(l+r)/2; if(mid*mid>*this) r=mid; else l=mid; } return l;}bign::~bign(){}int main() {bign x,y,x1,x2,x3,y1,y2,y3,x4,y4;bign a,b,c,d,e,f;bign ling=0;int t;bign dis;bign tes;cin>>t;while(t--){cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;x1=x1*max_n;y1=y1*max_n;x2=x2*max_n;y2=y2*max_n;y3=y3*max_n;x3=x3*max_n;x4=x4*max_n;y4=y4*max_n;a=x1-x2;b=y1-y2;c=x1-x3;d=y1-y3;e=(x1*x1-x2*x2-y2*y2+y1*y1)/2;f=(x1*x1-x3*x3-y3*y3+y1*y1)/2;x= (d*e-b*f)/(b*c-a*d);y= (a*f-c*e)/(b*c-a*d);dis=(x+x1)*(x+x1)+(y+y1)*(y+y1);tes=(x+x4)*(x+x4)+(y+y4)*(y+y4);if(dis<tes)printf("Accepted\n");elseprintf("Rejected\n");} return 0;}
阅读全文
0 0
- HDU 6206 Apple(高精度C++)
- HDU 6206 Apple(高精度浮点数)
- HDU 6206 Apple (数学 高精度计算)
- HDU 6026 Apple【高精度问题】
- HDU 6206 Apple(外心)
- HDU 6206 Apple 2017ICPC青岛网赛 A (高精度+大数模版)
- hdu6206—Apple(计算几何+高精度)
- HDU 6206 Apple (java大实数)
- hdu 6206 Apple(Java大数)
- hdu 6206 Apple
- HDU 6206 Apple
- 高精度加法(c++)
- hdu 6206 Apple 计算几何
- HDU 1063 Exponentiation (高精度)
- hdu 1002(简单高精度)
- HDU 1042 N!(高精度)
- 【高精度】高精度分数[c++]
- (C语言)高精度加法
- Python: sorted,operator.itemgetter的用法
- Scala知识点整理
- 【Skynet】Sproto初学与应用
- [简单逻辑学]逻辑学的基本原理——万物终有其根源
- Pairs Forming LCM LightOJ
- HDU 6206 Apple(高精度C++)
- 微信公众号开发常见问题整理
- MapKit/地图定位导航(第一篇:基本配置)
- Linux免密ssh登录
- Java编辑练习
- 黑裙安装-yellowcong
- 862C C. Mahmoud and Ehab and the xor XOR操作/构造
- 小米管培面试经历
- mysql jdbc 连接池配置