#ifndef MY_BIGN_H
#define MY_BIGN_H 1
#pragma GCC system_header
#include<cstring>
#include<algorithm>
#include<iostream>
using std::max;
using std::istream;
using std::ostream;
using std::string;

namespace zyf{
struct bign{
static const int maxlen=5000,limit=10000,width=4;
int len,bit[maxlen];
int& operator[](int p){ return bit[p]; }
void ClearBit(){ memset(bit,0,sizeof(bit)); }
void Delete0(){ for(;!bit[len-1] && len>1;--len); }

bign(int p=0){ *this=p; }
bign& operator=(int p){
ClearBit();
len=p?0:1; for(;p;p/=limit) bit[len++]=p%limit;
return *this;
}
bign(const char *p){ *this=p; }
bign& operator=(const char *p){
ClearBit();
len=0;
for(int i=strlen(p)-1;i>=0;i-=4){
int now=0;
for(int j=max(0,i-width+1);j<=i;++j) now=now*10+(p[j]-'0');
bit[len++]=now;
}
return *this;
}

bign& operator+=(bign b){
len=max(len,b.len)+1;
for(int i=0;i<len;++i) bit[i]+=b[i],bit[i+1]+=bit[i]/limit,bit[i]%=limit;
Delete0(); return *this;
}
bign& operator-=(bign b){
for(int i=0;i<len;++i){ bit[i]-=b[i]; if(bit[i]<0) bit[i]+=limit,--bit[i+1]; }
Delete0(); return *this;
}
bign& operator*=(bign b){
bign a=*this; ClearBit(); len=a.len+b.len;
for(int i=0;i<a.len;++i)
for(int j=0;j<b.len;++j)
bit[i+j]+=a[i]*b[j],bit[i+j+1]+=bit[i+j]/limit,bit[i+j]%=limit;
Delete0(); return *this;
}
bign& operator/=(int b){
for(int i=len-1;i>0;--i) bit[i-1]+=limit*(bit[i]%b),bit[i]/=b; bit[0]/=b;
Delete0(); return *this;
}

bool operator<(bign b) const{
if(len>b.len) return false;
if(len<b.len) return true;
for(int i=len-1;i>=0;--i)
if(bit[i]!=b[i]) return bit[i]<b[i];
return bit[0]<b[0];
}
bool operator==(bign b) const{ return !(*this<b) && !(b<*this); }
bool operator!=(bign b) const{ return !(*this==b); }
bool operator>(bign b) const{ return !(*this<b) && !(*this==b); }
bool operator<=(bign b) const{ return *this<b || *this==b; }
bool operator>=(bign b) const{ return *this>b || *this==b; }

bool odd(){ return bit[0]%2==1; }
bool even(){ return bit[0]%2==0; }
};
bign operator+(bign a,bign b){ return a+=b; }
bign operator-(bign a,bign b){ return a-=b; }
bign operator*(bign a,bign b){ return a*=b; }
bign operator/(bign a,int b){ return a/=b; }
istream& operator>>(istream &is,bign &p){
string s; is>>s; p=s.c_str();
return is;
}
ostream& operator<<(ostream &os,bign p){
os.fill('0'); os<<p.bit[p.len-1];
for(int i=p.len-2;i>=0;--i){ os.width(bign::width); os<<p.bit[i]; }
return os;
}

bign sqrt(bign x){
bign head=1,tail=x;
while(head<=tail){
bign mid=(head+tail)/2;
if(x<mid*mid) tail=mid-1; else head=mid+1;
}
return tail;
}
}
using zyf::bign;
#endif

dalao高精的更多相关文章

  1. Linux 高精確的時序(sleep, usleep,nanosleep) from:http://blog.sina.com.cn/s/blog_533ab41c0100htae.html

    Linux 高精確的時序(sleep, usleep,nanosleep) (2010-04-14 17:18:26) 转载▼ 标签: 杂谈 分类: linux 首先, 我会说不保证你在使用者模式 ( ...

  2. c++ 普通高精除高精

    //codevs3118 高精度练习之除法 //打出了高精除高精,内心有点小激动. //还记得已开始学的时候非常难打 #include<cstdio>#include<cstring ...

  3. c++普通高精加

    //作为一名蒟蒻,还请诸位不要吐槽. //第一次打c++高精加,内心有点小激动. //为codevs3116 高精度练习之加法 //程序太简单,就不打注释了. #include<cstdio&g ...

  4. BZOJ_1002_[FJOI2007]_轮状病毒_(递推+高精)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1002 )*&*(^&*^&*^**()*) 1002: [FJOI20 ...

  5. bzoj 3287: Mato的刷屏计划 高精水题 && bzoj AC150

    3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Desc ...

  6. codevs 3119 高精度练习之大整数开根 (各种高精+压位)

    /* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...

  7. vijos P1375 大整数(高精不熟的一定要做!)

    /* 我尼玛这题不想说啥了 亏了高精写的熟..... 加减乘除max都写了 高精二分 */ #include<iostream> #include<cstdio> #inclu ...

  8. noip 2012 国王游戏(贪心+高精)

    /* 我是不会说我考试的时候想到了正解却把金币取大看成金币求和的.... 觉得只按左右手乘积排序不太对 有反例 也可能我反例放到这个题里是错的吧 按自己的理解排的序 就是各种讨论... 假设 第i个人 ...

  9. noip推荐系列:遥控车[字符串+高精+二分答案]

    [问题描述] 平平带着韵韵来到了游乐园,看到了n辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i].韵韵早就迫不及待地想玩名字是s的遥控车.可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀( ...

随机推荐

  1. Docker实战 | 第三篇:Docker安装Nginx,实现基于vue-element-admin框架构建的项目线上部署

    一. 前言 在上一文中 点击跳转 通过IDEA集成Docker插件实现微服务的一键部署,但 youlai-mall 是前后端分离的项目,除了后端微服务的部署之外,当然还少不了前端工程的部署.所以本篇讲 ...

  2. PyQt(Python+Qt)学习随笔:QScrollArea的widgetResizable属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 滚动区域的widgetResizable属性用于控制滚动区域的内容部署层是否应跟随滚动区域的大小变化 ...

  3. 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍

    在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...

  4. PyQt(Python+Qt)学习随笔:QAbstractItemView的iconSize属性

    老猿Python博文目录 老猿Python博客地址 视图的iconSize属性用于控制显示icon的项上的icon图标大小,在视图可见情况下设置该属性会导致视图上的显示项重新调整布局. 可以使用ico ...

  5. 协程gevent学习

    import gevent def f1(): print(11) gevent.sleep(2) print(33) def f2(): print(22) gevent.sleep(1) prin ...

  6. 前端js实现九宫格模式抽奖(多宫格抽奖)

    介绍: 前端九宫格是一种常见的抽奖方式,js实现如下,掌握其原理,不论多少宫格,都可以轻松应对.(代码可复制直接运行看效果). 该案例以四宫格入门,可扩展多宫格,奖品模块的布局可自由设置. <! ...

  7. 【操作系统】页面置换算法(最佳置换算法)(C语言实现)

    [操作系统]页面置换算法(最佳置换算法)(C语言实现) (编码水平较菜,写博客也只是为了个人知识的总结和督促自己学习,如果有错误,希望可以指出) 1.页面置换算法: 在地址映射过程中,若在页面中发现所 ...

  8. MySQL最经典50道练习题

    表名和字段 学生表 Student(s_id,s_name,s_birth,s_sex):学生编号.学生姓名.出生年月.学生性别. 课程表 Course(c_id,c_name,t_id):课程编号. ...

  9. v-text、v-html、v-pre

    v-text 用于将数据填充到标签中,作用于插值表达式类似,但是相对于直接插值是没有闪动问题的 v-html 用于将HTML片段填充到标签中,但是可能有安全问题(易被跨域脚本攻击[XSS攻击]) v- ...

  10. [水题日常]UVA11181 条件概率(Probability|Given)

    话说好久没写blog了 好好学概率论的第一天,这题一开始完全不会写,列出个条件概率的公式就傻了,后来看着lrj老师的书附带的代码学着写的- 因为我比较弱智 一些比较简单的东西也顺便写具体点或者是按照书 ...