高精度模板(不定时更新)

以前写高精度基本都是抄别人的……这次要改变一下了……

现在的高精度模板还是很简陋的,只支持高精加,减,乘,高精除低精,高精模低精,高精快速幂,高精比较大小,没了。

或许以后会不定期更新一下……毕竟这个还是比较ca的。

直接一股脑全贴上来吧……注意所有的元素都是倒叙存储的,想要改成压位的很简单,只要改一下模数,改一下输入输出即可。

也可以支持不同进制的运算,都是很好改的。

struct big
{
   int f[M],len;
   big()
   {
      memset(f,0,sizeof(f)),len = 0;
   }
   big(char *s)
   {
      memset(f,0,sizeof(f)),len = 0;
      int l = strlen(s);
      per(i,l-1,0)
      {
     if(s[i] >= ‘0‘ && s[i] <= ‘9‘)    f[len++] = s[i] - ‘0‘;
     else if(s[i] >= ‘A‘ && s[i] <= ‘Z‘) f[len++] = s[i] - ‘A‘ + 10;
      }
      while(!f[len] && len > 0) len--;
   }
   big change(int k)
   {
      big a;
      while(k) a.f[a.len++] = k % 10,k /= 10;
      while(!a.f[a.len] && a.len > 0) a.len--;
      return a;
   }
   void modi(int k)
   {
      while(k) f[len++] = k % 10,k /= 10;
      while(!f[len] && len > 0) len--;
   }
   big operator + (const big &g) const
   {
      big c;
      c.len = max(len,g.len) + 1;
      rep(i,0,c.len) c.f[i] += f[i] + g.f[i];
      rep(i,0,c.len) c.f[i+1] += c.f[i] / B,c.f[i] %= B;
      while(!c.f[c.len] && c.len > 0) c.len--;
      return c;
   }
   big operator - (const big &g) const
   {
      big c;
      c.len = max(len,g.len);
      rep(i,0,c.len) c.f[i] = f[i] - g.f[i];
      rep(i,0,c.len) if(c.f[i] < 0) c.f[i] += 10,c.f[i+1]--;
      while(!c.f[c.len] && c.len > 0) c.len--;
      return c;
   }
   big operator * (const big &g) const
   {
      big c;
      c.len = len + g.len + 1;
      //printf("!%d %d %d\n",len,g.len,c.len);
      rep(i,0,len)
     rep(j,0,g.len)
     c.f[i+j] += f[i] * g.f[j];
      rep(i,0,c.len-1) c.f[i+1] += c.f[i] / 10,c.f[i] %= 10;
      while(!c.f[c.len] && c.len > 0) c.len--;
      return c;
   }
   big operator / (const int &g)
   {
      big c;
      int cur = 0;
      per(i,len,0) cur *= 10,cur += f[i],c.f[c.len++] = cur / g,cur %= g;
      reverse(c.f,c.f + c.len);
      while(!c.f[c.len] && c.len > 0) c.len--;
      return c;
   }
   int operator % (const int &g)
   {
      int cur = 0;
      per(i,len,0) cur *= 10,cur += f[i],cur %= mod;
      return cur;
   }
   bool operator > (const big &g)
   {
      if(len != g.len) return len > g.len;
      per(i,len,0)
      {
     if(f[i] == g.f[i]) continue;
     return f[i] > g.f[i];
      }
      return 0;
   }
   void print()
   {
      //per(i,len,0) printf("%d ",f[i]);
      per(i,len,0) (f[i] >= 10) ? printf("%c",f[i] - 10 + ‘A‘) : printf("%d",f[i]);
      enter;
   }
};

big bmax(const big &a,const big &b)
{
   if(a.len != b.len) return a.len > b.len ? a : b;
   per(i,a.len,0)
   {
      if(a.f[i] == b.f[i]) continue;
      else return a.f[i] > b.f[i] ? a : b;
   }
   return a;
}

原文地址:https://www.cnblogs.com/captain1/p/9873532.html

时间: 2024-10-27 19:12:32

高精度模板(不定时更新)的相关文章

高精度模板(Big_Int)

你还在为刷题时看到的高精度预警而苦恼吗? 你还在因为高精度难写而放弃宝贵的分数吗? 不用担心!让高精度模板 来帮助你! 目前已知bug: 长度最大值只能开到54724,超过这个值会爆炸(无法调试),目前原因未知 2018.09.07更新: 1.优化了高精乘以低精的速度. 2.输出优化,可使用.output()函数输出.(基于输出挂)@Jesse666 ps:那个长度最大值的bug有可能是栈空间的问题,可以试试更改栈空间有没有效果 2018.09.01更新: 1.鉴于@Jesse666同学的建议,

[Template]高精度模板

重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开始 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const i

iOS 属性修饰符记录 --不定时更新

重新审视了一下OC在属性修饰符,特意记录一下来.以后不定时更新 > retain:只有在非ARC下才会有效,所有如果在ARC下使用了retain修饰也白搭 如以下的data属性用retain修饰: #import <UIKit/UIKit.h> @interface MyView : UIView @property(nonatomic, retain) NSMUtableArray* data; @end 在对应的setter方法中,会以如下代码实现: if (_data != new

Android学习笔记(不定时更新)

在很久之前,我就想写写博客,不过本人比较懒,这几天心血来潮,决定开写博客,因为学习,实习,面试关系,不会定时更新,以下是我所学的知识,总结分享一下,如有不正确,希望各位轻喷. QQ:545662362.欢迎交流,因为第一次写博客,格式什么的也不是特别好.好了,学习目录如下 1.Android 开发环境搭建 2.Android 应用程序 3.Android 常用基本控件 4.Android 常用高级控件 5.Android 消息与广播 6.Service 后台服务 7.Android 数据存储与服

即日起,博客将不定时更新技术内容

Hello,everybody!这是我新开的博客,以后我会将我收藏的资源以及修改之后的资源发布到这里,希望对大家有所帮助. 同时,本人的个人贴吧也开通了,欢迎有志之士加入我这个大家庭,帮助更多开发者,共同学习,共同进步. 贴吧链接 吕昌辉吧 即日起,博客将不定时更新技术内容,布布扣,bubuko.com

apue第四章习题的一些拙见(不定时更新)

写在前面:最近要期末考试,看来真的是要不定时更新啦XD apue4.1: 由于在这里lstat是不跟随符号文件的,而stat是跟随符号文件的,这样一来,如果使用stat,而不使用lstat那么就无法观察到符号文件.在书上4.3姐中有提到. apue4.2: 首先我在ubuntu的shell上查看原来的umask是多少,结果是0002,这里touch一个文件是不确定的,但是其他者的权限中写的权限一定是没有的.因为创建一个文件所拥有的权限不光与umask有关还与应用程序自身在创建的时候使用的参数有关

linux下svn定时更新项目

方法一.用shell脚本定时更新项目 1.进入网站的根目录,假设项目位置放在/var/www/test cd /var/www/test 2.建立脚本文件update.sh,分两步进行.首先利用touch命令创建,之后使用vim进行编辑. touch update.sh vim update.sh 输入以下内容 #!/bin/sh while true do svn update --username 你的svn用户名 --password 你的svn密码 sleep 60 done 这里我设置

[Android Traffic] 调整定时更新的频率(C2DM与退避算法)

转载自: http://blog.csdn.net/kesenhoo/article/details/7395253 Minimizing the Effect of Regular Updates[最小化定时更新操作的副作用] 最佳的定时更新频率是不确定的,通常由设备状态,网络连接状态,用户行为与用户定义明确的偏好而决定. Optimizing Battery Life([Android Training - 04]优化电池寿命)这一章有讨论如何根据设备状态来修改更新频率.里面介绍了当断开网络

KindEditor问题汇总【不定时更新】

问题一:KindEditor放在隐藏的元素里面,当用jq控制其显示时KindEditor编辑器显示不出来. 解决方法:在textarea 加个宽 就OK了<textarea id="Contents1" name="Contents1" rows="5" cols="30" style="width:500px"></textarea> 相关链接1:http://kindeditor