|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 额外减小 于 2023-10-14 00:57 编辑
rt。
框架已经写好了。接下来就是一些内置函数了。
代码中实现了高精度加减乘除膜,还有快读快输。可以自行添加其他功能。
代码中是512位二进制存储,到十进制能存155位,相当多了。
你们可以自己扩展到1024bit(309十进制位),65536bit(19729十进制位)。多大的高精度都能用。
这就是传说中的用时间换空间。
二进制计算是完全没有空间浪费的。你不管是普通高精(int存10种数字)或者压位高精都是有很大的内存浪费的。
所以我们在不是算法竞赛的时候一定要用时间换空间啊!(bushi
- #include <iostream>
- #include <cstdio>
- #include <typeinfo>
- #include <bitset>
- #include <string>
- #include <utility>
- #include <algorithm>
- using namespace std;
- const int _bits=512;
- // 准备写一个高精度类。用 std::bitset
- inline int to_int(bitset<_bits> x)
- {
- int maxn=min(32,_bits),ans=0;
- for(int i=0,j=1;i<maxn;i++,j*=2)
- {
- if(x[i])
- ans+=j;
- }
- return ans;
- }
- inline int highest_true(bitset<_bits> x)
- {
- for(int i=_bits-1;i>=0;i--)
- {
- if(x[i])return i;
- }
- return -1;
- }
- inline bool operator>(bitset<_bits> x,bitset<_bits> y)
- {
- for(int i=_bits-1;i>=0;i--)
- {
- if(x[i]&&!y[i])
- return true;
- if(!x[i]&&y[i])
- return false;
- }
- return false;
- }
- inline bool operator<(bitset<_bits> x,bitset<_bits> y)
- {
- for(int i=_bits-1;i>=0;i--)
- {
- if(x[i]&&!y[i])
- return false;
- if(!x[i]&&y[i])
- return true;
- }
- return false;
- }
- inline bool operator>=(bitset<_bits> x,bitset<_bits> y)
- {
- return !(x<y);
- }
- inline bool operator<=(bitset<_bits> x,bitset<_bits> y)
- {
- return !(x>y);
- }
- inline bitset<_bits> operator+(bitset<_bits> x,bitset<_bits> y)
- {
- bool c;
- bitset<_bits> ans;
- ans[0]=x[0]^y[0];
- c=x[0]&&y[0];
- for(int i=1;i<_bits;i++)
- {
- ans[i]=(x[i]&&y[i]&&c)||(x[i]&&!y[i]&&!c)||(!x[i]&&y[i]&&!c)||(!x[i]&&!y[i]&&c);
- c=(x[i]&&y[i]&&c)||(x[i]&&y[i]&&!c)||(!x[i]&&y[i]&&c)||(x[i]&&!y[i]&&c);
- }
- return ans;
- }
- inline bitset<_bits> operator-(bitset<_bits> x,bitset<_bits> y)
- {
- return x+~y+(bitset<_bits>)1;
- }
- inline bitset<_bits> operator*(bitset<_bits> x,bitset<_bits> y)
- {
- bitset<_bits> tmpx=x,tmpy=y,ans;
- while(tmpx.any())
- {
- if(tmpx[0])
- {
- ans=ans+tmpy;
- }
- tmpx>>=1;
- tmpy<<=1;
- }
- return ans;
- }
- inline pair< bitset<_bits> , bitset<_bits> > divmod(bitset<_bits> x,bitset<_bits> y)
- {
- int ht1=highest_true(x),ht2=highest_true(y);
- pair< bitset<_bits>,bitset<_bits> > ans_pair;
- if(ht1<ht2)
- {
- ans_pair.first=0;
- ans_pair.second=x;
- return ans_pair;
- }
- bitset<_bits> tmpx=x,tmpy=y<<(ht1-ht2),div;
- while(1)
- {
- //cout<<tmpx<<endl<<tmpy<<endl<<div<<endl<<endl;
-
- div[0]=(tmpx>=tmpy);
-
-
- if(div[0])
- tmpx=tmpx-tmpy;
- if(tmpx<y)
- break;
- div<<=1;
- tmpy>>=1;
- }
- div<<=(highest_true(tmpy)-ht2);
- //cout<<highest_true(tmpy)<<' '<<ht2<<endl;
- ans_pair.first=div;
- ans_pair.second=tmpx;
- //cout<<endl<<"div: "<<div<<" "<<(highest_true(tmpy)-ht2)<<endl;
- return ans_pair;
- }
- inline bitset<_bits> operator/(bitset<_bits> x,bitset<_bits> y)
- {
- return divmod(x,y).first;
- }
- inline bitset<_bits> operator%(bitset<_bits> x,bitset<_bits> y)
- {
- return divmod(x,y).second;
- }
- inline bitset<_bits>& operator+=(bitset<_bits> & x,const bitset<_bits> y)
- {
- return x=x+y;
- }
- inline bitset<_bits>& operator-=(bitset<_bits> & x,const bitset<_bits> y)
- {
- return x=x-y;
- }
- bitset<_bits>& operator*=(bitset<_bits> & x,const bitset<_bits> y)
- {
- return x=x*y;
- }
- bitset<_bits>& operator/=(bitset<_bits> & x,const bitset<_bits> y)
- {
- return x=x/y;
- }
- bitset<_bits>& operator%=(bitset<_bits> & x,const bitset<_bits> y)
- {
- return x=x%y;
- }
- inline void fast_read(bitset<_bits> &x)
- {
- x.reset();
- bool isneg=false;
- char ch=getchar();
- while(!isdigit(ch))
- {
- if(ch=='-')isneg=true;
- ch=getchar();
- }
- while(isdigit(ch))
- {
- x=(x<<3)+(x<<1)+(ch^48);
- ch=getchar();
- }
- if(isneg)x=~x+1;
- }
- inline void fast_print(const bitset<_bits> &x)
- {
- if(x>9)
- fast_print(x/10);
- putchar(to_int(x%10)+48);
- }
- inline void in_int(bitset<_bits> &x)
- {
- int a;
- cin>>a;
- x=a;
- }
- inline void out_int(bitset<_bits> &x)
- {
- string str=x.to_string();
-
- int ans=0,l=str.length();
- for(int i=l-1,j=1;i>=0;i--,j*=2)
- {
- if(str[i]=='1')ans+=j;
- }
- cout<<"output : "<<ans<<endl;
- }
- int main()
- {
- bitset<_bits> a1;
- while(1)
- {
- fast_read(a1);
- fast_print(a1);
- putchar('\n');
- }
- }
复制代码 |
|