鱼C论坛

 找回密码
 立即注册
查看: 457|回复: 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

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <typeinfo>
  4. #include <bitset>
  5. #include <string>
  6. #include <utility>
  7. #include <algorithm>
  8. using namespace std;

  9. const int _bits=512;

  10. // 准备写一个高精度类。用 std::bitset

  11. inline int to_int(bitset<_bits> x)
  12. {
  13.         int maxn=min(32,_bits),ans=0;
  14.         for(int i=0,j=1;i<maxn;i++,j*=2)
  15.         {
  16.                 if(x[i])
  17.                 ans+=j;
  18.         }
  19.         return ans;
  20. }

  21. inline int highest_true(bitset<_bits> x)
  22. {
  23.         for(int i=_bits-1;i>=0;i--)
  24.         {
  25.                 if(x[i])return i;
  26.         }
  27.         return -1;
  28. }

  29. inline bool operator>(bitset<_bits> x,bitset<_bits> y)
  30. {
  31.         for(int i=_bits-1;i>=0;i--)
  32.         {
  33.                 if(x[i]&&!y[i])
  34.                 return true;
  35.                 if(!x[i]&&y[i])
  36.                 return false;
  37.         }
  38.         return false;
  39. }

  40. inline bool operator<(bitset<_bits> x,bitset<_bits> y)
  41. {
  42.         for(int i=_bits-1;i>=0;i--)
  43.         {
  44.                 if(x[i]&&!y[i])
  45.                 return false;
  46.                 if(!x[i]&&y[i])
  47.                 return true;
  48.         }
  49.         return false;
  50. }

  51. inline bool operator>=(bitset<_bits> x,bitset<_bits> y)
  52. {
  53.         return !(x<y);
  54. }

  55. inline bool operator<=(bitset<_bits> x,bitset<_bits> y)
  56. {
  57.         return !(x>y);
  58. }

  59. inline bitset<_bits> operator+(bitset<_bits> x,bitset<_bits> y)
  60. {
  61.         bool c;
  62.         bitset<_bits> ans;
  63.         ans[0]=x[0]^y[0];
  64.         c=x[0]&&y[0];
  65.         for(int i=1;i<_bits;i++)
  66.         {
  67.                 ans[i]=(x[i]&&y[i]&&c)||(x[i]&&!y[i]&&!c)||(!x[i]&&y[i]&&!c)||(!x[i]&&!y[i]&&c);
  68.                 c=(x[i]&&y[i]&&c)||(x[i]&&y[i]&&!c)||(!x[i]&&y[i]&&c)||(x[i]&&!y[i]&&c);
  69.         }
  70.         return ans;
  71. }

  72. inline bitset<_bits> operator-(bitset<_bits> x,bitset<_bits> y)
  73. {
  74.         return x+~y+(bitset<_bits>)1;
  75. }

  76. inline bitset<_bits> operator*(bitset<_bits> x,bitset<_bits> y)
  77. {
  78.         bitset<_bits> tmpx=x,tmpy=y,ans;
  79.         while(tmpx.any())
  80.         {
  81.                 if(tmpx[0])
  82.                 {
  83.                         ans=ans+tmpy;
  84.                 }
  85.                 tmpx>>=1;
  86.                 tmpy<<=1;
  87.         }
  88.         return ans;
  89. }

  90. inline pair< bitset<_bits> , bitset<_bits> > divmod(bitset<_bits> x,bitset<_bits> y)
  91. {
  92.         int ht1=highest_true(x),ht2=highest_true(y);
  93.         pair< bitset<_bits>,bitset<_bits> > ans_pair;
  94.         if(ht1<ht2)
  95.         {
  96.                 ans_pair.first=0;
  97.                 ans_pair.second=x;
  98.                 return ans_pair;
  99.         }
  100.         bitset<_bits> tmpx=x,tmpy=y<<(ht1-ht2),div;
  101.         while(1)
  102.         {
  103.                 //cout<<tmpx<<endl<<tmpy<<endl<<div<<endl<<endl;
  104.                
  105.                 div[0]=(tmpx>=tmpy);
  106.                
  107.                
  108.                 if(div[0])
  109.                 tmpx=tmpx-tmpy;
  110.                 if(tmpx<y)
  111.                 break;
  112.                 div<<=1;
  113.                 tmpy>>=1;
  114.         }
  115.         div<<=(highest_true(tmpy)-ht2);
  116.         //cout<<highest_true(tmpy)<<' '<<ht2<<endl;
  117.         ans_pair.first=div;
  118.         ans_pair.second=tmpx;
  119.         //cout<<endl<<"div: "<<div<<" "<<(highest_true(tmpy)-ht2)<<endl;
  120.         return ans_pair;
  121. }

  122. inline bitset<_bits> operator/(bitset<_bits> x,bitset<_bits> y)
  123. {
  124.         return divmod(x,y).first;
  125. }

  126. inline bitset<_bits> operator%(bitset<_bits> x,bitset<_bits> y)
  127. {
  128.         return divmod(x,y).second;
  129. }

  130. inline bitset<_bits>& operator+=(bitset<_bits> & x,const bitset<_bits> y)
  131. {
  132.         return x=x+y;
  133. }

  134. inline bitset<_bits>& operator-=(bitset<_bits> & x,const bitset<_bits> y)
  135. {
  136.         return x=x-y;
  137. }

  138. bitset<_bits>& operator*=(bitset<_bits> & x,const bitset<_bits> y)
  139. {
  140.         return x=x*y;
  141. }

  142. bitset<_bits>& operator/=(bitset<_bits> & x,const bitset<_bits> y)
  143. {
  144.         return x=x/y;
  145. }

  146. bitset<_bits>& operator%=(bitset<_bits> & x,const bitset<_bits> y)
  147. {
  148.         return x=x%y;
  149. }

  150. inline void fast_read(bitset<_bits> &x)
  151. {
  152.         x.reset();
  153.         bool isneg=false;
  154.         char ch=getchar();
  155.         while(!isdigit(ch))
  156.         {
  157.                 if(ch=='-')isneg=true;
  158.                 ch=getchar();
  159.         }
  160.         while(isdigit(ch))
  161.         {
  162.                 x=(x<<3)+(x<<1)+(ch^48);
  163.                 ch=getchar();
  164.         }
  165.         if(isneg)x=~x+1;
  166. }

  167. inline void fast_print(const bitset<_bits> &x)
  168. {
  169.         if(x>9)
  170.         fast_print(x/10);
  171.         putchar(to_int(x%10)+48);
  172. }

  173. inline void in_int(bitset<_bits> &x)
  174. {
  175.         int a;
  176.         cin>>a;
  177.         x=a;
  178. }

  179. inline void out_int(bitset<_bits> &x)
  180. {
  181.         string str=x.to_string();
  182.        
  183.         int ans=0,l=str.length();
  184.         for(int i=l-1,j=1;i>=0;i--,j*=2)
  185.         {
  186.                 if(str[i]=='1')ans+=j;
  187.         }
  188.         cout<<"output : "<<ans<<endl;
  189. }

  190. int main()
  191. {
  192.         bitset<_bits> a1;
  193.         while(1)
  194.         {
  195.                 fast_read(a1);
  196.                 fast_print(a1);
  197.                 putchar('\n');
  198.         }
  199. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-5-1 17:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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