#include<bitset>
#include<algorithm>
#include<iostream>
#include<string>
#include<deque>
#include<cstdio>
using namespace std; class int128; void shift(int128 & in,deque<bool> & de); template<size_t N>
bool operator<(bitset<N> const& b1,bitset<N> const& b2)
{
int i=N;
while( i-- && b1[i]==b2[i] ) { } return ((-1 == i) ? false : (b1[i]<b2[i]));
} class int128
{
bitset<128> number;
public:
explicit int128(string str):number(str){}
int128(bitset<128>const& b):number(b){}
int128(int a = 0 , int b = 0 , int c = 0 , int d = 0)
{
bitset<32> b1(a),b2(b),b3(c),b4(d);
int i, k = 128;
for(i = 32 ; i ; number[--k] = b1[--i]) { }
for(i = 32 ; i ; number[--k] = b2[--i]) { }
for(i = 32 ; i ; number[--k] = b3[--i]) { }
for(i = 32 ; i ; number[--k] = b4[--i]) { }
}
bool operator[](size_t i)const
{
return number[i];
}
bitset<128>::reference operator[](size_t i)
{
return number[i];
}
friend bool operator<(int128 const& i1,int128 const& i2)
{
return i1.number < i2.number;
} friend int128 operator+(int128 const& i1,int128 const& i2)
{
if(i1 == 0)
return i2;
if(i2 == 0)
return i1;
int128 result;
bitset<2> sum; for(int i = 0 ; i < 128 ; ++i)
{
sum=i1[i]+i2[i]+sum.to_ulong();
result[i]=sum[0];
sum>>=1;
}
return result;
} friend int128 operator-(int128 const& i1,int128 const& i2)
{
if(i2==0)
return i1; int128 result=i1; for(int i = 0 ; i < 128 ; ++i)
{
if(i2[i] == 0) {}
else
{
if(result[i] == 1)
result[i] = 0;
else
{
int k = i;
while(k < 128 && result[k] == 0)
{
result[k] = 1;
++k;
}
if(k != 128)
result[k] = 0;
}
}
} return result;
}
friend int128 operator*(int128 const& i1,int128 const& i2)
{
if(i1==0 || i2==0)
return int128();
if(i1==1)
return i2;
if(i2==1)
return i1; int128 acc=int128(); for(int i=0;i<128;++i)
{
if(i2[i]==1)
{
acc=acc+(i1<<i);
}
} return acc;
}
friend int128 operator/(int128 const& i1,int128 const& i2)
{
if(i1 < i2)
return int128();
deque<bool> de;
bool flag = 0;
for(int i = 127 ; i >= 0 ; --i)
{
if(flag == 0 && i1[i] == 0) {}
else
{
flag = 1;
de.push_back(i1[i]);
}
} int128 div = int128();
int128 result = int128(); while(!de.empty())
{
shift(div,de);
if(div < i2)
{
result = result<<1;
}
else
{
result = (result<<1) + int128(0,0,0,1);
div = div - i2;
}
} return result;
}
friend int128 operator%(int128 const& i1,int128 const& i2)
{
if(i1 < i2)
return i1;
deque<bool> de;
bool flag = 0;
for(int i = 127 ; i >= 0 ; --i)
{
if(flag == 0 && i1[i] == 0) {}
else
{
flag = 1;
de.push_back(i1[i]);
}
} int128 div = int128();
int128 result = int128(); while(!de.empty())
{
shift(div,de);
if(div < i2)
{
result = result<<1;
}
else
{
result = (result<<1) + int128(0,0,0,1);
div = div - i2;
}
} return div;
}
friend bool operator==(int128 const& i,int const k)
{
bitset<32> bb(k);
for(int g = 0 ; g < 32 ; ++g)
{
if(i[g] != bb[g])
return 0;
}
return 1;
}
void operator=(bitset<128>const& b)
{
number = b;
}
friend ostream& operator<<(ostream& o,int128 const& i)
{
o<<i.number;
return o;
}
int128 operator<<(size_t step)const
{
return int128(number<<step);
}
unsigned long to_ulong()const
{
return *((unsigned long*)&number);
} public:
bool ToDecimalStr(std::string &str)
{
str.clear();
char buf[128] = {0};
int128 Radix(0, 0, 0, 10);
for(int128 num = number; !(num == 0); num = num/Radix)
{
if( sprintf(buf, "%d", ((int)(num%Radix).to_ulong())) < 0 )
{
return false;
}
str = buf + str;
}
return true;
} static void Print(int128 & data, bool bEndl = true)
{
string str;
if( data.ToDecimalStr(str) )
{
printf("%s%s", str.c_str(), (bEndl?"\n":""));
}
}
}; static int128 const one = int128(0,0,0,1); template<size_t N>
void add_one(bitset<N>& b)
{
int i = 0;
while(i < N && b[i] == 1)
{
b[i] = 0;
++i;
}
if(i == N)
return;
b[i] = 1;
} void add_one(int128& k)
{
int i = 0;
while(i < 128 && k[i] == 1)
{
k[i] = 0;
++i;
}
if(i == 128)
return;
k[i] = 1;
} void shift(int128 & in,deque<bool> & de)
{
if(de.front()==1)
{
de.pop_front();
in=(in<<1)+one;
}
else
{
de.pop_front();
in=in<<1;
}
} bool IsPrime(int128 const& number)
{
for(int128 i = int128(0,0,0,2) ; i < number ; add_one(i))
{
if(number%i == 0)
return 0;
}
return 1;
}

  这个是某dalao写的int128类,可能不是那么好用,暂存,回家搞一点事情。

__int128的实现的更多相关文章

  1. 关于__int128

    定义 __int128 n,r,g,b,T; __int128 ans; __int128 f[][]; 取最大值函数 __int128 getmax(__int128 a,__int128 b){ ...

  2. __int128

    __int128 __uint128 __int128_t __uint128_t 大小:16字节 2^128(sizeof()) 2^128 39位 340282366920938463463374 ...

  3. 关于 __int128

    __int128 是 GCC 提供的扩展(extension),可以当作 128 位整数使用. 关于 __int128 和 __int128_t Normally, _t suffix means a ...

  4. hdu6222——佩尔方程&&大数__int128

    题意 给定一个整数 $N$($1 \leq N \leq 10^{30}$),求最小的整数 $t$,要求 $t \geq N$,使得边长为 $t-1, t, t+1$ 的三角形面积为整数. 分析 根据 ...

  5. __int128 输入输出模板

    #include <bits/stdc++.h> using namespace std; void scan(__int128 &x)//输入 { x = ; ; char ch ...

  6. iostream重载__int128

    Normal (Naive)写法,用 string(char* ) std::ostream& operator <<(std::ostream&out,const __i ...

  7. HDU6719 Strassen(__int128)

    HDU6719 Strassen 直接照题目模拟,数据范围最大不会超过__int128. 时间复杂度为 \(O(\log n)\) . #include<bits/stdc++.h> us ...

  8. __int128使用

    输入输出模板: __int128无法使用cin和cout进行输入输出,所以只能自己写一个输入输出的模板: #include <bits/stdc++.h> using namespace ...

  9. 详解__int128

    前言 如果遇到 long long 开不下的情况,可以使用 __int128 来博一把! note :__int128 仅 \(64\) 位 \(GCC G++\) 支持,不在 \(C++\) 标准中 ...

随机推荐

  1. CCEditBox/CCEditBoxImplMac

    #ifndef __CCEditBoxIMPLMAC_H__ #define __CCEditBoxIMPLMAC_H__ #include "cocos2d.h" #if (CC ...

  2. PHP array_intersect_ukey()

    定义和用法 array_intersect_ukey() 函数用回调函数比较键名来计算数组的交集. array_intersect_ukey() 返回一个数组,该数组包含了所有出现在 array1 中 ...

  3. Android 绘制圆形图片

    经常在项目中,会遇到使用圆形头像. 然而图片往往不是圆形的,我们须要对图片进行处理.以达到圆形图片的效果.这里.我总结了一下经常使用的android圆形图片的绘制的方法. 主要有以下几种方式:1.画布 ...

  4. PCB 3D PCB 后续改进与扩展功能一些想法

    再次感受到WelGl实现3D效果的震撼, 一.目前功能: Gerber与钻孔 解析 并转为3D实景图,用户360度操控 二.后续改进扩展功能: 1.增加ODB++解析 2. 3D 尺寸标注(外形尺寸, ...

  5. E20170829-mk

    Parse   vt. 从语法上描述或分析(词句等); serial    adj. 连续的; 连载的; 顺序排列的; 分期偿付的; MultiThread n. 多线程; 多流; concurren ...

  6. 原生JS---1

    js的历史 在上个世纪的1995年,当时的网景公司正凭借其Navigator浏览器成为Web时代开启时最著名的第一代互联网公司. 由于网景公司希望能在静态HTML页面上添加一些动态效果,于是叫Bren ...

  7. html5 窗口之间的通信

    一般窗口通信分为三种: iframe嵌套:多个iframe之间通信. 父页面操作子页面元素:oFrame.contentWindow.document.body. 父页面调用子页面方法:oFrame. ...

  8. Android Gradle 学习笔记(七):Android Gradle 插件

    我们知道Android Gradle其实就是一个Gradle的一个第三方插件,它是由Google的Android团队开发的,基于Gradle构建的,和Android Studio完美搭配.相比于旧的构 ...

  9. SpringCloud(二) 服务注册与发现Eureka

    1.eureka是干什么的? 上篇说了,微服务之间需要互相之间通信,那么通信就需要各种网络信息,我们可以通过使用硬编码的方式来进行通信,但是这种方式显然不合适,不可能说一个微服务的地址发生变动,那么整 ...

  10. 题解 UVA10587 【Mayor's posters】

    先讲一下:dalao @lisuier 发布的前一篇题解严格来讲是有错误的 比如下一组数据: 1 3 1 10 1 4 7 10 显然答案是3,然而用lisuier dalao的程序做出来的答案是2( ...