[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]高精度模板的更多相关文章

  1. art template前端模板引擎

    偶然看到后台有一段代码 采用的是art template的模板引擎 地址为 http://aui.github.io/artTemplate/ 这段代码很简洁 var html = template( ...

  2. C++高精度模板

    原文地址:http://blog.csdn.net/wall_f/article/details/8373395 原文只附代码,没有解析,本文增加了一些对代码的解释. 请注意:本模板不涉及实数运算与负 ...

  3. Template Method 模板设计模式

    什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...

  4. Atitit.eclipse comment  template注释模板

    Atitit.eclipse comment  template注释模板 1. Code templet1 1.1. Settpath1 1.2. 设置存储1 1.3. 导出设置1 2. Java d ...

  5. [note]高精度模板

    高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...

  6. vue-learning:12-1- HTML5的<template>内容模板元素

    HTML5的<template>内容模板元素 HTML内容模板<template>元素将它其中的内容存储在页面文档中,以供后续使用,该内容的DOM结构在加载页面时会被解析器处理 ...

  7. 高精度模板 支持各种运算 c++

    绪言 自从有了高精度模板,妈妈再也不用怕我不会打高精度了! 代码 代码长度与日俱增啊~~~ #include<iostream> #include<cstring> #incl ...

  8. Vue2.0 【第二季】第5节 Template制作模板

    目录 Vue2.0 [第二季]第5节 Template制作模板 第5节 Template制作模板 一.直接写在选项里的模板 二.写在template标签里的模板 三.写在script标签里的模板 Vu ...

  9. Git Commit Template 提交模板

    多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...

随机推荐

  1. jenkins中使用tfs插件做增量的版本发布部署

    一 配置介绍 使用jenkins的tfs插件进行,源码的下载,编译,打包的操作,然后使用windows的批处理命令,在局域网内(或者本机)把打包的release包,删除掉web.config,然后靠配 ...

  2. Codeforces Round #234A

    Inna and choose option     题意: 一个由12个字符('O'或'X')组成的字符串,这12个字符可以排列成a*b(a*b=12)的矩阵,要求矩阵某一列都是'X'.用户输入t个 ...

  3. Java03

      字符输入   Scanner scan = new Scanner(System.in); char ch = scan.next().charAt(0);   车到路口例   package C ...

  4. ABP 初探 之User、Role、Permission数据库设计 (EntityFramework 继承的另一种使用方法)

    最近群里(134710707)的朋友都在讨论ABP源码,我把最近学习的内容记录下来,同时也分享给大家,希望正在研究ABP源码的朋友有一定帮助. 上篇介绍ABP的多语言,本篇主要介绍权限的数据库设计,用 ...

  5. .NET程序员走向高端必读书单汇总

    .NET程序员走向高端必读书单汇总 一.知识树 1. 基本能力 1.1 数学 1.2 英语 1.3 语言表达 2. 计算机组织与体系结构 3. 算法与数据结构 4. 操作系统 5. 计算机网络 6. ...

  6. angular单元测试与自动化UI测试实践

    关于本文:介绍通过karma与jsmine框架对angular开发的应用程序进行单元与E2E测试. angular单元测试与集成测试实践 先决条件 创建项目 webstorm中创建空白web项目 创建 ...

  7. IE8,IE10下载的临时文件到哪里去了???

    操作攻略: 打开IE浏览器=>工具=>Internet选项=>常规选项卡中,找到"浏览历史记录"=>设置,然后就可看到"当前位置"所列出 ...

  8. css中的各种单位简述以及ios10下safari禁止缩放的问题

    px:绝对单位,页面按精确像素展示 em:相对单位,基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体是16px),整个页面内1em不是一个固定的值. rem:相对 ...

  9. Windows 10 的音频和 MIDI API将统一

    微软一统 Windows 10 的音频和 MIDI API 微软在夏季NAMM上的A3E大会上做了主题演讲,他们对Windows 10的音频和MIDI API都做了新的规划,开发者针对Windows ...

  10. require 那点事

    require 提供了一个 模块管理的方案 不太熟悉的话挺多暗坑 团队引入 需谨慎 彻底熟悉后 再引入项目 ADM规范 Asynchronous Module Definition - 异步加载模块规 ...