[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 ...
随机推荐
- Java集合概述
容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...
- JS效果集锦
秒后消失 $('.success_message').text( '反馈成功' ); setTimeout(function(){ $( ".success_messa ...
- java语言中除数为零问题
在以下几个例子中,输出结果如何? float aa=0; System.out.println(aa/0); System.out.println(1/aa); System.out.println( ...
- jQuery中的事件处理
1.页面载入完毕响应事件所谓页面载入完毕是指DOM元素载入就绪了,能够被读取和操作了.①jQuery中的$(doucument).ready()事件ready(fn)是jQuery事件模块中最重要的一 ...
- spritecow改造
快速入口 不读文章可以直接拐向这里: spritecow二代:https://kmdjs.github.io/arejs-tool-sprite/ 写在前面 工欲善其事必先利其器,最近fork了一份s ...
- 轻松掌握:JavaScript策略模式
策略模式 定义:定义一系列的算法,把它们一个个封装成函数,也可把它们作为属性统一封装进一个对象,然后再定义一个方法,该方法可根据参数自动选择执行对应的算法. 一般用于在实现一个功能时,有很多个方案可选 ...
- [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event
[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...
- [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
关联 关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分. 关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的. 在类的定义之外为类增加额外的存储空间 ...
- ORA-00824: cannot set sga_target due to existing internal settings, see alert log for more information
这篇文章是上篇文章”Expdp 导数错误 ORA-00832”的延续,前几天工作比较忙.累,直到今天才整理发出来.这个数据库实例的参数设置比较诡异其实是有原因的,由于这台数据库服务器系统是32位,数据 ...
- Linux LVM学习总结——放大LV容量
本篇介绍LVM管理中的命令lvresize,我们先创建一个卷组VG VolGroup02,它建立在磁盘/dev/sdc (大小为8G)上.创建逻辑卷LV时,我们故意只使用了一小部分.具体情况如下所示 ...