__int128的实现
#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的实现的更多相关文章
- 关于__int128
定义 __int128 n,r,g,b,T; __int128 ans; __int128 f[][]; 取最大值函数 __int128 getmax(__int128 a,__int128 b){ ...
- __int128
__int128 __uint128 __int128_t __uint128_t 大小:16字节 2^128(sizeof()) 2^128 39位 340282366920938463463374 ...
- 关于 __int128
__int128 是 GCC 提供的扩展(extension),可以当作 128 位整数使用. 关于 __int128 和 __int128_t Normally, _t suffix means a ...
- hdu6222——佩尔方程&&大数__int128
题意 给定一个整数 $N$($1 \leq N \leq 10^{30}$),求最小的整数 $t$,要求 $t \geq N$,使得边长为 $t-1, t, t+1$ 的三角形面积为整数. 分析 根据 ...
- __int128 输入输出模板
#include <bits/stdc++.h> using namespace std; void scan(__int128 &x)//输入 { x = ; ; char ch ...
- iostream重载__int128
Normal (Naive)写法,用 string(char* ) std::ostream& operator <<(std::ostream&out,const __i ...
- HDU6719 Strassen(__int128)
HDU6719 Strassen 直接照题目模拟,数据范围最大不会超过__int128. 时间复杂度为 \(O(\log n)\) . #include<bits/stdc++.h> us ...
- __int128使用
输入输出模板: __int128无法使用cin和cout进行输入输出,所以只能自己写一个输入输出的模板: #include <bits/stdc++.h> using namespace ...
- 详解__int128
前言 如果遇到 long long 开不下的情况,可以使用 __int128 来博一把! note :__int128 仅 \(64\) 位 \(GCC G++\) 支持,不在 \(C++\) 标准中 ...
随机推荐
- SSH框架之Struts(3)——Struts的执行流程之核心方法
上篇讲了Tomcat实例化一个单例的ActionServlet.依据web.xml配置文件做好对应的初始化工作. 这时client产生一个.do结尾的request请求,採用get/post方式提交之 ...
- CF #323 DIV2 D题
可以知道,当T较大时,对于LIS,肯定会有很长的一部分是重复的,而这重复的部分,只能是一个block中出现次数最多的数字组成一序列.所以,对于T>1000时,可以直接求出LIS,剩下T-=100 ...
- Shredding Company (hdu 1539 dfs)
Shredding Company Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu1595find the longest of the shortest 最短路
//给一个无向图,问删除一条边,使得从1到n的最短路最长 //问这个最长路 //这个删除的边必定在最短路上,假设不在.那么走这条最短路肯定比其它短 //枚举删除这条最短路的边,找其最长的即为答案 #i ...
- 尝试create tech team
自从上一家公司之后,我很少有机会去带一些新人(公司一般都招一些技术独立性的工程师),特别是经验不是特别多的新小伙伴.在如今管理扁平化的公司,我正逐渐搭建自己的小team,并试图让团队成员快速融入并成长 ...
- VC问题 IntelliSense:“没有可用的附加信息”,[请參见“C++项目 IntelliSense 疑难解答”,获得进一步的帮助]
在XP上安装VS2010 后发现 IntelliSense不能使用,但在Windows7上是能够正常使用这功能的.关于IntelliSense不能使用的问题已有网友提出了是由于KB2876217这个补 ...
- python chunk 方式读取大文件——本质上还是file read自身支持
参考:https://stackoverflow.com/questions/519633/lazy-method-for-reading-big-file-in-python 最优雅方式: file ...
- hdoj--1027--Ignatius and the Princess II(dfs)
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- Hardwood Species(map)
http://poj.org/problem?id=2418 题意:给定一系列字符串,要求按字典序升序输出每个串,并输出每个串出现的百分比. 用map做的,交c++A了,G++ WA..so sad. ...
- Appium + python - 监控appium server start
import osimport time as t def start_appium(port = 4723,udid="4871660c"): a = os.popen(&quo ...