鱼C论坛

 找回密码
 立即注册
查看: 672|回复: 2

[技术交流] 效率极低的高精度算法(二进制操作,bitset)

[复制链接]
发表于 2023-10-14 00:48:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 额外减小 于 2023-10-14 00:57 编辑

rt。
框架已经写好了。接下来就是一些内置函数了。

代码中实现了高精度加减乘除膜,还有快读快输。可以自行添加其他功能。

代码中是512位二进制存储,到十进制能存155位,相当多了。

你们可以自己扩展到1024bit(309十进制位),65536bit(19729十进制位)。多大的高精度都能用。

这就是传说中的用时间换空间

二进制计算是完全没有空间浪费的。你不管是普通高精(int存10种数字)或者压位高精都是有很大的内存浪费的。
所以我们在不是算法竞赛的时候一定要用时间换空间啊!(bushi

QQ截图20231014005642.png
#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');
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-14 10:41:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-14 18:58:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 21:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表