[Template]高精度模板
[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[], n;
int& operator [](int x) {return a[x];}
Big():n() {memset(a, , sizeof(a));}
void ini(int x) {a[]=x; n=;}
}; Big operator *(Big a, int b) {
int g=;
for(int i=; 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=; i<=a.n; i++) {
int g=;
for(int j=; j<=b.n; j++)
g += c[i+j-]+a[i]*b[j], c[i+j-] = g%B, g/=B;
c[i+b.n] = g;
}
c.n = a.n + b.n;
while(c.n> && c[c.n]==) c.n--;
return c;
} Big operator +(Big a, Big b) {
int g=, n=max(a.n, b.n);
for(int i=; i<=n; i++) {
g += i<=a.n ? a[i] : ;
g += i<=b.n ? b[i] : ;
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=; i<=b.n; i++) {
if(a[i]<b[i]) a[i]+=B, a[i+]--;
a[i] -= b[i];
}
int p=b.n+;
while(a[p]<) a[p]+=B, a[++p]--;
while(a.n> && a[a.n]==) a.n--;
return a;
} void Print(Big &a) {
printf("%d", a[a.n]);
for(int i=a.n-; i>=; i--) printf("%04d", a[i]);
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=,B=1e4,W=,L=; struct big{
int size,d[L];
big():size(){memset(d,,sizeof(d));}
}; //---------------------------------------------------
bool operator <(big &a,int b){//a<b
if(a.size==&&a.d[]<b) return true;
else return false;
} big operator +(big a,int b){
int t=a.d[]+b,g=t/B;
a.d[]=t%B;
for(int i=;g;i++){//jin wei
t=a.d[i]+g;
a.d[i]=t%B;
g=t/B;
a.size=max(a.size,i);//update size
}
return a;
}
big operator -(big a,int b){
if(a.d[]<b){//jie wei
a.d[]+=B;
int i;
for(i=;a.d[i]==;i++) a.d[i]+=B-;
a.d[i]--;
while(a.d[a.size]==) a.size--;//update size
}
a.d[]-=b;//last minus
return a;
}
big operator *(big a,int b){
int g=;
for(int i=;i<=a.size;i++){//mul
int t=a.d[i]*b+g;
a.d[i]=t%B;
g=t/B;
}
while(g){//jin wei
a.d[++a.size]=g%B;//update size
g/=B;
}
return a;
}
big operator /(big a,int b){
int g=;
for(int i=a.size;i>=;i--){//divide
g=g*B+a.d[i];
a.d[i]=g/b;
g%=b;
}
while(a.d[a.size]==) a.size--;//update size
return a;
} //---------------------------------------------------
bool operator <(big a,big b){//a<b
if(a.size!=b.size) return a.size<b.size;
for(int i=;i<=a.size;i++)
if(a.d[i]!=b.d[i]) return a.d[i]<b.d[i];
return false;//a==b
}
big operator +(big a,big b){
int g=,i;
for(i=;;i++){
if(g==&&i>a.size&&i>b.size) break;
int t=g;
t+=i<=a.size?a.d[i]:;
t+=i<=b.size?b.d[i]:;
a.d[i]=t%B;
g=t/B;
}
a.size=i-;//update size
return a;
}
big operator -(big a,big b){
for(int i=;i<=b.size;i++){
if(a.d[i]<b.d[i]){//jie wei
int p=i+;
while(a.d[p]==) p++;
a.d[p]--;p--;
while(p!=i) a.d[p--]+=B-;
a.d[i]+=B;
}
a.d[i]-=b.d[i];
}
while(a.d[a.size]==) a.size--;
if(a.size<=) a.size=;
return a;
}
big operator *(big a,big b){
big c;
for(int i=;i<=a.size;i++){
int g=;
for(int j=;j<=b.size;j++){
c.d[i+j-]+=a.d[i]*b.d[j]+g;
g=c.d[i+j-]/B;
c.d[i+j-]%=B;
}
c.d[i+b.size]=g;
}
c.size=a.size+b.size;
while(c.d[c.size]==) c.size--;
if(c.size<=) c.size=;
return c;
} //---------------------------------------------------
//压位 B=1e4 W=4
void scan(big &a,char s[]){//annoy B ,if B==10 you can directly use the string
int len=strlen(s+);
int p=a.size=len/W+(len%W!=);
for(int i=;i<=p;i++){
int r=len-(i-)*W,l=max(len-i*W+,);
for(int j=l;j<=r;j++) a.d[i]=a.d[i]*+s[j]-'';
}
}
void print(big &a){//When B==1e4;If B==10 just print
printf("%d",a.d[a.size]);
for(int i=a.size-;i>=;i--){
if(a.d[i]<) printf("");
else if(a.d[i]<) printf("");
else if(a.d[i]<) printf("");
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+);scan(a,s);
scanf("%s",s+);scan(b,s);
a=a*b;
print(a);
}
以前的代码
[Template]高精度模板的更多相关文章
- art template前端模板引擎
偶然看到后台有一段代码 采用的是art template的模板引擎 地址为 http://aui.github.io/artTemplate/ 这段代码很简洁 var html = template( ...
- C++高精度模板
原文地址:http://blog.csdn.net/wall_f/article/details/8373395 原文只附代码,没有解析,本文增加了一些对代码的解释. 请注意:本模板不涉及实数运算与负 ...
- Template Method 模板设计模式
什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...
- Atitit.eclipse comment template注释模板
Atitit.eclipse comment template注释模板 1. Code templet1 1.1. Settpath1 1.2. 设置存储1 1.3. 导出设置1 2. Java d ...
- [note]高精度模板
高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...
- vue-learning:12-1- HTML5的<template>内容模板元素
HTML5的<template>内容模板元素 HTML内容模板<template>元素将它其中的内容存储在页面文档中,以供后续使用,该内容的DOM结构在加载页面时会被解析器处理 ...
- 高精度模板 支持各种运算 c++
绪言 自从有了高精度模板,妈妈再也不用怕我不会打高精度了! 代码 代码长度与日俱增啊~~~ #include<iostream> #include<cstring> #incl ...
- Vue2.0 【第二季】第5节 Template制作模板
目录 Vue2.0 [第二季]第5节 Template制作模板 第5节 Template制作模板 一.直接写在选项里的模板 二.写在template标签里的模板 三.写在script标签里的模板 Vu ...
- Git Commit Template 提交模板
多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...
随机推荐
- (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6
ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念 ...
- Python 3.4 Library setup
matplotlib: https://pypi.python.org/pypi/matplotlib/1.4.3 Unofficial Windows Binaries for Python Ex ...
- linux 下添加库的加载路径的方式
linux 下有两种添加加载库路径的方式: 1.修改环境变量: export LD_LIBRARY_PATH=path_name 2.修改配置文件 修改 /etc/ld.so.conf 的内容在最后添 ...
- WNMP集成环境下配置thinkPHP
在网上查了许多解决方法,下面是自己测试过能行的方法,只需在nginx.conf文件添加内容就可以了. 打开nginx.conf文件 ## Try the requested URI as files ...
- rest api参数与content-type
最近为项目组提供rest api 时遇到了关于接口参数的传递问题,主要是没有充分考虑到第三方调用者的使用方式,应该尽量的去兼容公司之前提供出去的接口调用方式,这样可以降低第三方调用者的学习成本,尽管之 ...
- javascript俄罗斯方块游戏
在线试玩:http://keleyi.com/game/5/ 操作指南:键盘方向键←→控制左右移动,↑键变形,↓键快速下落. 别看这段js代码只有短短的100多行,效果却非常不错,用键盘的方向键操作, ...
- 三道Javascript的练习题
有语句“var x=0;while(____) x+=2;”,要使while循环体执行10次,空白处的循环判定式应写为: A.x<10B. x<=10C.x<20D.x<=20 ...
- iOS 多线程GCD简介
一.简介 1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法. Grand 含义是“伟大的.宏大的”,Central含义“中央的”,Dispat ...
- 从头开始构建LINUX [LFS]
“LINUX就是这个范”有一章专门介绍了Linux的构建,过程详细,很有意思.结合这方面的资料简要汇集一下 LFS 这个站点提供了从源代码构建一个Linux的详细步骤 书 http://archive ...
- iOS 开发中的争议(一)
序言 打算分享一些有争议的话题,并且表达一下我的看法.这是该系列的第一篇,我想讨论的是:类的成员变量应该如何定义? 在 Objective-C 的语言的早期,类的私有成员变量是只能定义在 .h 的头文 ...