高精度封装Bignum
还没有写完,目前只实现了加,乘,且不能作用于负数
\(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的更多相关文章
- noip2006 2^k进制数
设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w ...
- hdu1715
http://acm.hdu.edu.cn/showproblem.php?pid=1715 模板大数: #include <stdio.h> #include <string.h& ...
- hdu 1002 A+B
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002 复习一下大数 模板: #include <stdio.h> #include <s ...
- N! HDU 1042
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- 结构体封装高精度 大整数BigInt
曾经很讨厌高精度,因为它很长,不好记,而且在不是很单纯的题目里面感觉很烦(一个数就是一个数组).在一道题目中出现的时候总是用一些奇技淫巧混过去(比如把两个$long$ $long$拼在一起). 现在. ...
- [SinGuLaRiTy] 复习模板-高精度模板
[SinGuLaRiTy-1042] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 结构体封装 //高精度运算 注意%I64d与%lld # ...
- [Template]高精度模板
重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开 ...
- 【PCB】电子元件封装大全及封装常识
电子元件封装大全及封装常识 电子元件封装大全及封装常识 一.什么叫封装封装,就是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接.封装形式是指安装半导体集成电路芯片用的外壳.它不仅起着 ...
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...
随机推荐
- 小程序以及H5页面上IphoneX底部安全区域小黑条适配问题
背景 公司项目开发中,发现iPhoneX上吸底元素存在被小黑条遮挡的问题 原因 在苹果 iPhoneX .iPhone XR等机型上,物理Home键被取消,改为底部小黑条替代home键功能,从而导致吸 ...
- 面试题 ~ 什么是RESTful?
一 : 说说什么是REST规则 ① 首先什么是REST ? 基于HTTP.URI.XML.JSON等标准和协议,支持轻量级.跨平台.跨语言的架构设计.是Web服务的一种新的架构风格(一种思想). ...
- AJ学IOS 之微博项目实战(8)用AFNetworking和SDWebImage简单加载微博数据
AJ分享,必须精品 一:效果 没有图文混排,也没有复杂的UI,仅仅是简单的显示出微博数据,主要介绍AFNetworking和SDWebImage的简单用法 二:加载数据AFNetworking AFN ...
- sql server临时删除/禁用非聚集索引并重新创建加回/启用的简便编程方法研究对比
前言: 由于新型冠状病毒影响,博主(zhang502219048)在2020年1月份从广东广州工作地回到广东揭阳产业转移工业园磐东街道(镇里有阳美亚洲玉都.五金之乡,素以“金玉”闻名)老家后,还没过去 ...
- intellij idea 设置用真机测试android
android自带的模拟器是不容置疑的慢,genymontion虽然快,但是觉得有点怪的感觉,哈哈,其实这些都不是重点. 之前是用myeclipse开发android的,虽然一直很想用eclipse来 ...
- webWMS开发过程记录(五)- 详细设计之系统界面框架设计
界面区域划分 使用frameset分了上中下三个区域 上:显示系统名称和用户信息,以及一些提示信息(需通过Ajax定时更新提示信息),显示高度固定 中:再次使用frameset分成左右区域 左:显示导 ...
- 一站式WebAPI与认证授权服务
保护WEBAPI有哪些方法? 微软官方文档推荐了好几个: Azure Active Directory Azure Active Directory B2C (Azure AD B2C)] Ident ...
- L1线性回归
线性回归 主要内容包括: 线性回归的基本要素 线性回归模型从零开始的实现 线性回归模型使用pytorch的简洁实现 代码下载地址 https://download.csdn.net/download/ ...
- D. 蚂蚁平面
D. 蚂蚁平面 单点时限: 2.0 sec 内存限制: 512 MB 平面上有 n只蚂蚁,它走过的路径可以看作一条直线 由这n 条直线定义的某些区域是无界的,而另一些区域则是有界的. 有界区域的最大个 ...
- Mysql数据操作指令
-----多数据插入-----只要写一次insert指令,但是可以直接插入多条记录insert into table values(),(),(); 主键冲突我们插入值的时候,主键中已经存在某个值,插 ...