[SinGuLaRiTy] 复习模板-高精度模板
【SinGuLaRiTy-1042】 Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.
结构体封装
//高精度运算 注意%I64d与%lld
#define LL long long int
struct bignum
{
LL num[MAXN] ;
void init()
{
memset(num,,sizeof num);
} bool operator < (const bignum &a)const
{
if(num[]!=a.num[])return num[]<a.num[];
for(int i=num[];i>;--i)
if(num[i]!=a.num[i])
return num[i]<a.num[i];
return ;
} void operator += (const LL &a)
{
num[]+=a ;
for(int i=;i<=num[];++i)
{
num[i+]+=num[i]/mod;
num[i]%=mod;
}
while(num[num[]+]>)++num[];
} bignum operator + (const LL a)const
{
bignum temp=*this;
temp+=a;
return temp ;
} void operator += (const bignum &a)
{
num[]=max(num[],a.num[]);
for(int i=;i<=num[];++i)
{
num[i]+=a.num[i];
num[i+]+=num[i]/mod;
num[i]%=mod;
}
while(num[num[]+]>)++num[];
} bignum operator + (const bignum &a)const
{
bignum temp=*this;
temp+=a;
return temp;
} void operator -= (const LL &a)
{
num[]-=a;
for(int i=;num[i]<&&i<=num[];++i)
while(num[i]<)
{
num[i]+=mod;
--num[i+];
}
while(num[num[]]<=&&num[]>)--num[];
} bignum operator - (const LL &a)const
{
bignum temp=*this;
temp-=a;
return temp ;
} void operator -= (const bignum &a)
{
for(int i=;i<=num[];++i)
{
num[i]-=a.num[i];
while(num[i]<)
{
num[i]+=mod ;
--num[i+];
}
}
while(num[num[]]<=&&num[]>)--num[];
} bignum operator - (const bignum &a)const
{
bignum temp=*this;
temp-=a;
return temp;
} void operator *= (const LL &a)
{
for(int i=;i<=num[];++i)
num[i]*=a;
for(int i=;i<=num[];++i)
{
num[i+]+=num[i]/mod;
num[i]%=mod;
}
} bignum operator * (const LL &a)const
{
bignum temp=*this;
temp*=a;
return temp;
} bignum operator * (const bignum &a)const
{
bignum c;
c.init();
c.num[]=num[]+a.num[]-;
for(int i=;i<=num[];++i)
for(int j=;j<=a.num[];++j)
c.num[i+j-]+=num[i]*a.num[j];
for(int i=;i<=c.num[];++i)
{
c.num[i+]+=c.num[i]/mod;
c.num[i]%=mod;
}
while(c.num[c.num[]+]>)
{
++c.num[];
c.num[c.num[]+]+=c.num[c.num[]]/mod;
c.num[c.num[]]%=mod;
}
return c;
} void operator *= (const bignum &a)
{
bignum c=*this;
c=c*a;
*this=c;
} void operator /= (const LL &a)
{
for(int i=num[];i>;--i)
{
num[i-]+=(num[i]%a*mod);
num[i]/=a;
}
num[]/=a;
while(num[]>&&num[num[]]<=)--num[];
} bignum operator / (const LL &a)const
{
bignum temp=*this ;
temp/=a;
return temp;
} void operator %= (const LL &a)
{
bignum temp=*this;
temp=temp-temp/a*a;
*this=temp;
} bignum operator % (const LL &a)const
{
bignum temp=*this;
temp%=a;
return temp;
} void operator /=(const bignum &a){
bignum l ,m ,r =*this;
l.init();
l.num[]= ;
while(l<r)
{
m=(l+r+)/;
if(*this<(a*m)) r=m-;
else l=m;
}
*this=l;
} bignum operator / (const bignum &a)const
{
bignum temp=*this;
temp/=a;
return temp;
} void operator %= (const bignum &a)
{
bignum c=*this;
c=c-c/a*a;
*this=c;
} bignum operator % (const bignum &a)const
{
bignum c=*this;
c%=a;
return c;
} void read()
{
scanf("%s",word);
int len=strlen(word) ;
for(int i=;i<len;++i)
num[(len-i-)/+]=num[(len-i-)/+]*+word[i]-'' ;
num[]=(len-)/+ ;
}
void put()
{
printf("%I64d",num[num[]]);
for(int i=num[]-;i>;--i)
printf("%08I64d",num[i]);
puts("");
}
}
Main函数单独封装
加法
#include<stdio.h>
#include<string.h>
char a[],b[];
char c[];
int i;
void swap(char a[])
{
char tmp;
for(int i=;i<strlen(a)/;i++)
{
tmp=a[i];
a[i]=a[strlen(a)--i];
a[strlen(a)--i]=tmp;
}
}
void add(char a[],char b[])
{
for(i=;i<strlen(a)&&i<strlen(b);i++)
{
c[i]+=a[i]+b[i]-'';
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(strlen(a)==strlen(b))
if(c[i]==)
c[i]='';
if(strlen(a)>strlen(b))
{
if(c[i]==)
{
for(;i<strlen(a);i++)
{
c[i]+=a[i];
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(c[i-]=='')
c[i]='';
}
else
for(;i<strlen(a);i++)
c[i]=a[i];
}
if(strlen(b)>strlen(a))
{
if(c[i]==)
{
for(;i<strlen(b);i++)
{
c[i]+=b[i];
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(c[i]==)
c[i]='';
}
else
for(;i<strlen(b);i++)
c[i]=b[i];
}
}
int main()
{
scanf("%s",a);
scanf("%s",b);
swap(a);
swap(b);
add(a,b);
swap(c);
printf("%s",c);
return ;
}
减法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[],b[];
int a1[],b1[];
int c[];
int i,j,al,bl,l;
int main()
{
scanf("%s",a);
scanf("%s",b);
al=strlen(a);
bl=strlen(b);
l=al>bl?al:bl;
for(i=;i<al;i++)
a1[al-i-]=a[i];
for(i=;i<bl;i++)
b1[bl-i-]=b[i];
for(i=l-;i>=;i--)
{
if(al>bl || a1[i]>b1[i])
{
for(j=;j<l;j++){
c[j]=a1[j]-b1[j]+'';
if(b1[j]==)
c[j]-='';
}
for(j=;j<l-;j++)
if(c[j]<'')
{
c[j]+=;
c[j+]--;
}
while(c[l-]==''&&l!=)
l--;
for(j=l-;j>=;j--)
printf("%c",c[j]);
break;
}
if(al<bl||a1[i]<b1[i])
{
for(j=;j<l;j++)
{
c[j]=b1[j]-a1[j]+'';
if(a1[j]==)
c[j]-='';
}
for(j=;j<l-;j++)
if(c[j]<'')
{
c[j]+=;
c[j+]--;
if(c[j+]==''&&j+==l-)
l--;
}
while(c[l-]==''&&l!=)
l--;
printf("-");
for(j=l-;j>=;j--)
printf("%c",c[j]);
break;
}
}
return ;
}
乘法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int jw,sum,ac,bc,k;
int a,b,ans[];
string A;
string B;
int main()
{
cin>>A>>B;
ac=A.size()-;
bc=B.size()-;
for(int i=;i<=ac;i++)
{
a=A[ac-i]-'';
for(int j=;j<=bc;j++)
{
k=i+j;
b=B[bc-j]-'';
ans[k]+=a*b;
if(ans[k]>=)
{
ans[k+]+=ans[k]/;
ans[k]%=;
}
}
}
if(ans[k+]>)
k++;
for(int i=k;i>=;i--)
cout<<ans[i];
return ;
}
开方
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
int l;
int work(int o,char *O,int I)
{
char c,*D=O ;
if(o>)
{
for(l=;D[l];D[l++]-=)
{
D[l++]-=;
D[l]-=;
while(!work(,O,l))
D[l]+=;
putchar((D[l]+)/);
}
putchar();
}
else
{
c=o+(D[I]+)%-(I>l/)*(D[I-l+I]+)/-;
D[I]+=I< ? : !(o=work(c/,O,I-))*((c+)%-(D[I]+)%);
}
return o;
}
int main()
{
char s[];
s[]='';
scanf("%s",s+);
if(strlen(s)%==)
work(,s+,);
else
work(,s,);
return ;
}
整数除法
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
char s1[],s2[];
int a1[],a2[],a3[],a4[],len1,len2,len3,i,j;
int bi(int a3[],int a4[])
{
if(a3[]<a4[])
return ;
if(a3[]>a4[])
return ;
for(int i=a3[];i>;i--)
{
if(a3[i]<a4[i])
return ;
if(a3[i]>a4[i])
return ;
}
return ;
}
int jian(int a3[],int a4[])
{
for(int i=;i<=a3[];i++)
{
if(a3[i]<a4[i])
{
a3[i]+=;
a3[i+]--;
}
a3[i]-=a4[i];
}
for(;a3[a3[]]==&&a3[]>;a3[]--);
}
int main()
{
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
for(i=;i<len1;i++)
a1[len1-i]=s1[i]-'';
for(i=;i<len2;i++)
a2[len2-i]=s2[i]-'';
a1[]=len1;
a2[]=len2;
a4[]=a1[]-a2[]+;
for(i=a4[];i>;i--)
{
memset(a3,,sizeof(a3));
for(j=;j<=a2[];j++)
a3[j+i-]=a2[j];
a3[]=a2[]+i-;
for(;bi(a1,a3);)
{
a4[i]++;
jian(a1,a3);
}
}
for(;a4[a4[]]==&&a4[]>;a4[]--);
for(i=a4[];i>;i--)
printf("%d",a4[i]);
return ;
}
高精度非整除求余数除法
#include<iostream>
#include<cstring>
using namespace std;
int a[],b[],c[];
int d,i;
void init(int a[])
{
string s;
cin>>s;
a[]=s.length();
for(i=;i<=a[];i++)
{
a[i]=s[a[]-i]-'';
}
}
void print(int a[])
{
int i;
if(a[]==)
{
cout<<<<endl;
return;
}
for(i=a[];i>;i--)
{
cout<<a[i];
}
cout<<endl;
return;
}
int compare(int a[],int b[])
{
int i;
if(a[]>b[])
return ;
if(a[]<b[])
return -;
for(i=a[];i>;i--)
{
if(a[i]>b[i])
return ;
if(a[i]<b[i])
return -;
}
return ;
}
void subtraction(int a[],int b[])
{
int flag,i;
flag=compare(a,b);
if(flag==)
{
a[]=;
return;
}
if(flag==)
{
for(i=;i<=a[];i++)
{
if(a[i]<b[i])
{
a[i+]--;
a[i]+=;
}
a[i]-=b[i];
}
while(a[]>&&a[a[]]==)
a[]--;
return;
}
}
void numcpy(int p[],int q[],int det)
{
for(int i=;i<=p[];i++)
{
q[i+det-]=p[i];
}
q[]=p[]+det-;
}
void Division(int a[],int b[],int c[])
{
int i,tmp[];
c[]=a[]-b[]+;
for(i=c[];i>;i--)
{
memset(tmp,,sizeof(tmp));
numcpy(b,tmp,i);
while(compare(a,tmp)>=)
{
c[i]++;
subtraction(a,tmp);
}
}
while(c[]>&&c[c[]]==)
c[]--;
return;
}
int main()
{
memset(a,,sizeof(a));
memset(b,,sizeof(a));
memset(c,,sizeof(a));
init(a);
init(b);
Division(a,b,c);
print(c);
print(a);
return ;
}
*四则高精度混合运算
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1000
struct hp{
int a[MAXN+];
hp(){
memset(a,,sizeof a);
a[]=;
}
hp(int n){
memset(a,,sizeof a);
a[]=;
while(n){
a[++a[]]=n%;
n/=;
}
if(!a[])
a[]=;
}
hp(char *s){
memset(a,,sizeof a);
int len=strlen(s);
for(int i=;i<=len;i++)
a[i]=s[len-i]-'';
a[]=len;
}
hp operator*(const hp &b)const{
hp c;
int i,j,len=a[]+b.a[];
for(i=;i<=a[];i++)
for(j=;j<=b.a[];j++)
c.a[i+j-]+=a[i]*b.a[j];
for(i=;i<len;i++){
c.a[i+]+=c.a[i]/;
c.a[i]%=;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator/(int b)const{
hp c;
int d=,i,len=a[];
for(i=a[];i;i--){
d=d*+a[i];
c.a[i]=d/b;
d%=b;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator+(const hp &b)const{
hp c;
int len=max(a[],b.a[]),i;
for(i=;i<=len;i++){
c.a[i]+=a[i]+b.a[i];
c.a[i+]=c.a[i]/;
c.a[i]%=;
}
len++;
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator-(const hp &b)const{
hp c;
int i,len=a[];
for(i=;i<=len;i++){
c.a[i]+=a[i]-b.a[i];
if(c.a[i]<)
c.a[i]+=,c.a[i+]--;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
void operator*=(const hp &x){
*this=*this*x;
}
void operator/=(const int &x){
*this=*this/x;
}
void operator+=(const hp &x){
*this=*this+x;
}
void operator-=(const hp &x){
*this=*this-x;
}
void print(){
for(int i=a[];i;i--)
printf("%d",a[i]);
}
bool operator>(const hp&b)const{
if(a[]>b.a[])
return ;
if(a[]<b.a[])
return ;
for(int i=a[];i;i--)
if(a[i]>b.a[i])
return ;
else if(a[i]<b.a[i])
return ;
return ;
}
bool operator<(const hp&b)const{
if(a[]<b.a[])
return ;
if(a[]>b.a[])
return ;
for(int i=a[];i;i--)
if(a[i]<b.a[i])
return ;
else if(a[i]>b.a[i])
return ;
return ;
}
bool operator<=(const hp&b)const{
return !(*this>b);
}
hp operator/(const hp&b)const{
hp l(),r(*this),mid;
while(l<r){
mid=(l+r+)/;
if(mid*b<=*this)
l=mid;
else
r=mid-;
}
return l;
}
void operator/=(const hp&b){
*this=*this/b;
}
}a,b,c;
char s[MAXN+];
void read(){
scanf("%s",s);
a=s;
scanf("%s",s);
b=s;
}
int main()
{
read();
c=a/b;
c.print();
puts("");
a-=c*b;
a.print();
}
Time: 2017-10-16
[SinGuLaRiTy] 复习模板-高精度模板的更多相关文章
- [Template]高精度模板
重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开 ...
- C++高精度模板
原文地址:http://blog.csdn.net/wall_f/article/details/8373395 原文只附代码,没有解析,本文增加了一些对代码的解释. 请注意:本模板不涉及实数运算与负 ...
- [note]高精度模板
高精度模板 先定义一个struct struct gj{ int l,s[N]; bool fh; void Print(){ if(fh)putchar('-'); for(int i=l;i> ...
- 高精度模板 支持各种运算 c++
绪言 自从有了高精度模板,妈妈再也不用怕我不会打高精度了! 代码 代码长度与日俱增啊~~~ #include<iostream> #include<cstring> #incl ...
- C++复习:函数模板和类模板
前言 C++提供了函数模板(function template).所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表.这个通用函数就称为函数模板.凡是函数体 ...
- C++:类模板与模板类
6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从 ...
- C++:函数模板与模板函数
6.1 模板的概念 C++允许用同一个函数定义函数,这些函数的参数个数和参数类型不同.例如求最大值的max函数, int max(int x,int y) { return (x>y ...
- C++ template学习一(函数模板和模板函数)
函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:templat ...
- vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板)
vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板): Customizing ASP.NET MVC 5/Web API 2 Scaffoldi ...
随机推荐
- 解决adb push时出现的"Read-only file system"问题
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- Url Rewrite 再说Url 重写
前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL>, URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜索 ...
- SQLSERVER 死锁标志
最开始做DBA的时候,整天死锁到头痛1222,至今都能回想到这个错误窗口: 死锁定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待 ...
- Java学习笔记-嵌套类
嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...
- 阿里云EMR集群初始化后的开发准备工作
前言:EMR的集群使用越来越普遍,但是每一次的集群释放到集群的重新创建,期间总有一些反复的工作需要查询与配置.为方便后续工作查阅,现在对集群初始化后的工作进行大概的梳理如下. ...
- MicroPython最全资料集锦丨TPYBoard全系列教程之文档+例程源码
MicroPython成功将Python引入到嵌入式领域,近几年MicroPython的发展和普及也证明,Python无疑将在未来几年内快速抢占和蚕食C/C++的份额.包括现在比较火爆的机器人.无人机 ...
- 【后缀自动机】洛谷P3804模板题
题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...
- chrome使用技巧整理
查看chrome的相关快捷键:打开chrome,按下F1,点击"键盘和鼠标快捷键". 1.查看版本: 浏览器输入网址:chrome://version/ 2.查看Chrome进程清 ...
- 关于JS中变量提升的规则和原理的一点理解
关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...
- 【Java学习笔记之五】java数组详解
数组 概念 同一种类型数据的集合.其实数组就是一个容器. 数组的好处 可以自动给数组中的元素从0开始编号,方便操作这些元素. 格式1: 元素类型[] 数组名 = new 元素类型[元素个数或数组长度] ...