高精度封装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 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...
随机推荐
- 全方位认识HBase:一个值得拥有的NoSQL数据库(一)
前言:说起HBase这门技术,在认知上对于稍微接触或使用过它的人来讲,可能只是百千数据库中一个很普通的库,大概就像我对Redis的认知一样:缓存嘛!可对于HBase,我确实是带着某些感情在的.今日突然 ...
- niuke --abc
链接:https://ac.nowcoder.com/acm/contest/1083/A来源:牛客网 给出一个字符串s,你需要做的是统计s中子串”abc”的个数.子串的定义就是存在任意下标a< ...
- (一)C# Windows Mobile 半透明窗体
Windows Mobile,个人心中臻至完美的系统. 不忍自己对WM的钻研成果消逝,故留作纪念. 系列开篇,便是一个曾令自己困扰很久的问题:如何实现半透明窗体. 如果了解Win32编程,其实很简单. ...
- 一个可能是世界上最全的 API 接口集合库开源项目
对于程序员来说,为自己的程序选择一些合适的API并不是那么简单,有时候还会把你搞得够呛,今天猿妹要和大家分享一个开源项目,这个项目汇集了各种开发的api,涵盖了音乐.新闻.书籍.日历等,无论你是从事W ...
- Java如何遍历二维数据
/* 需求:二维数组遍历 外循环控制的是二维数组的长度,其实就是一维数组的个数. 内循环控制的是一维数组的长度.*/class Array2Test { public static void main ...
- python os模块判断文件是否存在
import os os.path.exists(test_file.txt)
- bootstrap4中使用fontawesome5.6.3
先下载fontawesome5.6.3,选择free for web,下载完解压,丢在资源目录下 <form action=""> <div class=&quo ...
- SESSION劫持
服务端和客户端之间是通过session(会话)来连接沟通.当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session.每个用户的session都是独立的,并且由服务器来维护.每个用户的s ...
- Spring5参考指南:基于Schema的AOP
文章目录 基于Schema的AOP 定义Aspect 定义Pointcut 定义Advice advice参数 Advisors 基于Schema的AOP 上篇文章我们讲到了使用注解的形式来使用Spr ...
- 【ubuntu】Error: environment block too small. Press any key to continue
Error: environment block too small. Press any key to continue 如何修复这个Error呢? 输入以下命令 sudo su cd /boot/ ...