还没有写完,目前只实现了加,乘,且不能作用于负数

\(update\ in 20.4.8 添加了高精除低精ddiv函数,比较大小comp函数\)

#include <bits/stdc++.h>
using namespace std;
const int maxn=5009;
struct bignum{
int num[maxn],len;
bignum(){memset(num,0,sizeof(num));}
};
bool comp(bignum a,bignum b)//比较函数
{
if(a.len!=b.len) return (a.len>b.len)?1:0;
for(int i=a.len-1;i>=0;i--)
if(a.num[i]!=b.num[i]) return (a.num[i]>b.num[i])?1:0;
return -1;//相等
}
bignum operator / (bignum a,int b)//高精除以低精度
{
bignum c=a;
int tw=0,len=a.len;
for(int i=len-1;i>=0;i--)
{
int k=(tw*10+c.num[i])/b;
tw=(tw*10+c.num[i])%b;
c.num[i]=k;
}
while(c.num[len-1]==0) len--;
c.len=len;
return c;
}
bignum init(bignum &a,string s)
{
int len=s.length();
if(s[0]=='-')//处理负数
len--,a.num[maxn-1]=-1;//这样len-i-1就不会到0去,且留下是负数的标记
for(int i=0;i<len;i++)
a.num[i]=s[len-i-1]-'0';
a.len=len;
return a;
}
bignum Add(bignum &a,bignum &b)
{
bignum c;
int len=max(a.len,b.len);
for(int i=0;i<len;i++)
{
c.num[i]+=(a.num[i]+b.num[i]);
c.num[i+1]+=c.num[i]/10;
c.num[i]%=10;
}
if(c.num[len]) len++;//加法最多进1位
c.len=len;
return c;
}
bignum dmull(bignum &a,int s)//高精乘低精
{
for(int i=0;i<a.len;i++) a.num[i]*=s;
for(int i=0;i<a.len;i++)
{
if(a.num[i]>=10)
{
if(i==a.len-1) a.len++;
a.num[i+1]+=a.num[i]/10;
a.num[i]%=10;
}
}
return a;
}
bignum Hmull(bignum &a,bignum &b)//高精乘高精
{
bignum c;
for(int i=0;i<a.len;i++)
for(int j=0;j<b.len;j++)
{
c.num[i+j]+=(a.num[i]*b.num[j]);
c.num[i+j+1]+=c.num[i+j]/10;
c.num[i+j]%=10;
}
int len=a.len+b.len;
while(c.num[len-1]==0&&len>1) len--;
c.len=len;
return c;
}
bignum ddiv(bignum a,bignum b,bignum &c,int &f)//低精度除法
{
//c是除的结果,f是余数
for(int i-a.len-1;i>=0;i--)
{
f=f*10+a.num[i];//慢慢做求余
c.num[i]=f/b;
f%=b;
}
while(len>1&&c.num[len-1]==0) len--;
c.len=len;
}
void print(bignum &a)
{
for(int i=a.len-1;i>=0;i--) cout<<a.num[i];
}
int main()
{
int n;
cin>>n;
bignum temp,ans;
//下面是求解S=1!+2!+3!....+n!
init(ans,"1");init(temp,"1");
for(int i=2;i<=n;i++)
{
temp=dmull(temp,i);
ans=Add(ans,temp);
}
print(ans);
}

高精度封装Bignum的更多相关文章

  1. noip2006 2^k进制数

    设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w ...

  2. hdu1715

    http://acm.hdu.edu.cn/showproblem.php?pid=1715 模板大数: #include <stdio.h> #include <string.h& ...

  3. hdu 1002 A+B

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002 复习一下大数 模板: #include <stdio.h> #include <s ...

  4. N! HDU 1042

    N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  5. 结构体封装高精度 大整数BigInt

    曾经很讨厌高精度,因为它很长,不好记,而且在不是很单纯的题目里面感觉很烦(一个数就是一个数组).在一道题目中出现的时候总是用一些奇技淫巧混过去(比如把两个$long$ $long$拼在一起). 现在. ...

  6. [SinGuLaRiTy] 复习模板-高精度模板

    [SinGuLaRiTy-1042] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 结构体封装 //高精度运算 注意%I64d与%lld # ...

  7. [Template]高精度模板

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

  8. 【PCB】电子元件封装大全及封装常识

    电子元件封装大全及封装常识 电子元件封装大全及封装常识 一.什么叫封装封装,就是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接.封装形式是指安装半导体集成电路芯片用的外壳.它不仅起着 ...

  9. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

随机推荐

  1. mysql 向上取整

    SELECT CEILING(10.0)    --->10 SELECT CEILING(10.1)    --->11

  2. ES6构造函数class 和 ES5构造函数语法

    构造函数就是JavaScript程序定义好的函数,我们直接使用就可以,实际也是一种函数,构造函数专门用于生成定义对象,通过构造函数生成的对象,称为实例化对象 构造函数分为两种,一种是JavaScrip ...

  3. Starlims Client Request Portal 客户申请门户

    用户可以直接在starlims对外的"客户申请门户"上发起检验申请,并追踪检验进度等. 工作流程图示如下:

  4. Python - 翻译Talk Python To Me (和我聊Python) 播客

    “和我聊Python”是一个美国的聊天播客,英文名Talk Python To Me,类似于喜马拉雅的音频课程节目,只不过这个主题是编程语言Python.该节目从2015年的节目到现在,已经超过256 ...

  5. Python算法题:金字塔

    代码如下: #Python金字塔练习 """ 最大层数:max_level 当前层数:current_level 金字塔正序时: 每层的空格=最大层数-当前层数 每层的星 ...

  6. redis:String字符串类型(三)

    字符串拼接(如果key不存在则创建):append name " applesnt" 获取字符串的长度:strlen name 127.0.0.1:6379> set nam ...

  7. Git速查表大全

  8. Django ORM 查询表中某列字段值

    场景: 有一个表中的某一列,你需要获取到这一列的所有值,你怎么操作? 解决办法: 有一个model为:Event 方式一: 获取内容: Event.objects.values('title') 输出 ...

  9. bootstrop登陆页面

    bootstrap做登入注册页面,使用validate做表单验证 技术:bootstrap,font-awesome,jquery-validate: 特点:响应式布局,表单验证(用户两次密码是否相同 ...

  10. Python(4)

    lst = [1,2,4,8,16,32,64,128,256,512,1024,32769,65536,4294967296] # 输出 { 1:[1,2,3,8], 2:[16,32,64], 3 ...