[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 ...
随机推荐
- C# 工作中遇到的几个问题
C# 工作中遇到的几个问题 1.将VS2010中的代码编辑器的默认字体“新宋体”改为“微软雅黑”后,代码的注释,很难对齐,特别是用SandCastle Help File Builder生成帮助文档 ...
- 关于如何显示Jianshu图片的方案
问题的提出 简书是一个很好的博客网站,很多朋友都在jianshu上进行创作.当然出于各种目的,我们可能想将简书的文章同步到其他网站. 这个时候你会发现所有的文章里面的图片都无法正常显示了. 原因 如果 ...
- Java中的可变长参数
可变长参数的定义 与一般方法没多大差别,只不过形参多了...(三个点) 方法名(数据类型 ... 变量名){} 小案例: public class ParamDemo { public static ...
- PHP流程控制之特殊结构
在前两节介绍的循环结构中,都是通过循环语句本身提供的条件表达式来指定循环次数执行代码块直到停止循环.但如果想在循环体执行过程中中止循环,或是跳过一些循环继续执行其他代码块,我们就需要一些特殊的流程控制 ...
- php实现设计模式之 装饰模式
<?php /* * 装饰模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. * * 角色 * 抽象构件(Compone ...
- 使用gulp+browser-sync搭建前端项目自动化以及自动刷新
前段时间使用了gulp+browser-sync才发现这个东西真的很好用. 准备工作:(1).安装nodejs.gulp是基于nodejs使用的,所以先安装nodejs,https://nodejs. ...
- jquery编写插件的方法
版权声明:作者原创,转载请注明出处! 编写插件的两种方式: 1.类级别开发插件(1%) 2.对象级别开发(99%) 类级别的静态开发就是给jquery添加静态方法,三种方式 1.添加新的全局函数 2 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q133-Q135)
Question 133You create a Web Part that updates a list.You need to ensure that users can use the Web ...
- Linux命令学习总结:chage
命令简介: 该命令用于密码时效管理.它可以修改账号和密码的有效期.对于chage命令的描述如下所示: The chage command changes the number of days betw ...
- javascript-观察者模式
观察者模式方法 1.称之为消息机制或发布-订阅者模式 2.定义了一种依赖关系解决了主体对象与观察者之间功能的耦合 观察者方法 //将观察者放在闭包中,当页面加载就立即执行 var Observ ...