博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高精度模板
阅读量:5890 次
发布时间:2019-06-19

本文共 2643 字,大约阅读时间需要 8 分钟。

[2016-12-9]

重新写一下高精度模板(不要问我为什么)

自认为代码风格比较漂亮(雾

如果有更好的写法欢迎赐教 


封装结构体big

B是压位用的进制,W是每位长度

size表示长度,d[]就是保存的数字,倒着保存,从1开始

 


 

[2017-01-14]

update:修改一点bug,并且重载了运算符

[2017-02-16]

update:现在已经觉得这份代码没法看啦.........

[2017-03-25]

update:今天做一道题所以几乎重写了所有高精度...感觉不知道比以前高到哪里去了,以前的代码可能会有bug

这里放现在的代码:

 

struct Big{    int a[120], n;    int& operator [](int x) {
return a[x];} Big():n(1) {memset(a, 0, sizeof(a));} void ini(int x) {a[1]=x; n=1;}};Big operator *(Big a, int b) { int g=0; for(int i=1; i<=a.n; i++) g += a[i]*b, a[i] = g%B, g/=B; if(g) a[++a.n] = g; return a;}Big operator *(Big a, Big b) { Big c; for(int i=1; i<=a.n; i++) { int g=0; for(int j=1; j<=b.n; j++) g += c[i+j-1]+a[i]*b[j], c[i+j-1] = g%B, g/=B; c[i+b.n] = g; } c.n = a.n + b.n; while(c.n>1 && c[c.n]==0) c.n--; return c;}Big operator +(Big a, Big b) { int g=0, n=max(a.n, b.n); for(int i=1; i<=n; i++) { g += i<=a.n ? a[i] : 0; g += i<=b.n ? b[i] : 0; a[i] = g%B, g/=B; } a.n = n; if(g) a[++a.n] = g; return a;}Big operator -(Big a, Big b) { for(int i=1; i<=b.n; i++) { if(a[i]
1 && a[a.n]==0) a.n--; return a;}void Print(Big &a) { printf("%d", a[a.n]); for(int i=a.n-1; i>=1; i--) printf("%04d", a[i]);}

 

 

 

 

 

#include 
#include
#include
#include
#include
using namespace std;const int N=2005,B=1e4,W=4,L=2005;struct big{ int size,d[L]; big():size(0){memset(d,0,sizeof(d));}};//---------------------------------------------------bool operator <(big &a,int b){
//a
=1;i--){ //divide g=g*B+a.d[i]; a.d[i]=g/b; g%=b; } while(a.d[a.size]==0) a.size--;//update size return a;}//---------------------------------------------------bool operator <(big a,big b){ //aa.size&&i>b.size) break; int t=g; t+=i<=a.size?a.d[i]:0; t+=i<=b.size?b.d[i]:0; a.d[i]=t%B; g=t/B; } a.size=i-1;//update size return a;}big operator -(big a,big b){ for(int i=1;i<=b.size;i++){ if(a.d[i]
=1;i--){ if(a.d[i]<10) printf("000"); else if(a.d[i]<100) printf("00"); else if(a.d[i]<1000) printf("0"); printf("%d",a.d[i]); } putchar('\n');}//不压位 B=10 W=1//void scan(big &a,char s[]){// int len=strlen(s+1);// a.size=len; // for(int i=1;i<=len;i++) a.d[len-i+1]=s[i]-'0';//}//void print(big &a){// for(int i=a.size;i>=1;i--) printf("%d",a.d[i]);//}//---------------------------------------------------char s[N];big a,b;int main(){ //freopen("in.txt","r",stdin); scanf("%s",s+1);scan(a,s); scanf("%s",s+1);scan(b,s); a=a*b; print(a);}
以前的代码

 

转载地址:http://zeysx.baihongyu.com/

你可能感兴趣的文章
MATLAB实现频数表——hist的使用
查看>>
iphone 线程 NSCondition NSThread
查看>>
NSURLConnection下载文件并显示进度(HEAD)
查看>>
在Firefox中使用超级Bookmarklet
查看>>
Content type and column用法示例代码来自SharePoint会议
查看>>
设计模式:外观模式(Façade Pattern)
查看>>
ASP.NET中 DataList(数据列表)的使用前台绑定
查看>>
Linux学习之CentOS(八)--Linux系统的分区概念
查看>>
C语言字节对齐
查看>>
主域控制器的安装与配置步骤与方法
查看>>
调整Flash与div的位置关系
查看>>
Objective - c 创建二维数组
查看>>
〖Android〗/system/etc/fallback_fonts.xml
查看>>
30个美丽干净的,帮助用户专注于内容的网站设计
查看>>
高级Bash脚本编程指南(27):文本处理命令(三)
查看>>
JavaScript---事件
查看>>
Android NDK入门实例 计算斐波那契数列一生成jni头文件
查看>>
c/c++性能优化--I/O优化(上)
查看>>
将HTML特殊转义为实体字符的两种实现方式
查看>>
jquery 保留两个小数的方法
查看>>