[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 ...
随机推荐
- C语言--解引用
昨天,在<C和指针>上面看到"解引用"这个名词,就好奇的去查了查. (下面是一个大一渣渣的理解,请各位朋友海涵,如果有漏洞或者补充希望前辈不吝指正.) 例: #incl ...
- MySQL查询相关(初级)(全文重点)
where 是约束条件 先找到表 from t1 where 条件 : 指的是把表里的数据,一条一条的记录取出来 然后 group by 分组, having 是过滤条件 指记录已经出来 聚合 cou ...
- python科学计算_numpy_广播与下标
多维数组下标 多维数组的下标是用元组来实现每一个维度的,如果元组的长度比维度大则会出错,如果小,则默认元组后面补 : 表示全部访问: 如果一个下标不是元组,则先转换为元组,在转换过程中,列表和数组的转 ...
- 可视化编程开发板TurnipBit支持LED亮度可调功能
微软的makecode编辑器更新至版本v0.12.64.新增LED的可调亮度功能.而作为中文版可视化编程的口袋计算机TurnipBit完全兼容micro:bit,同样支持LED的亮度可调功能. 该项功 ...
- eclipse环境下日志打印输出
1.先将jdk配置一下 选Preferences---- 找到自己的jdk所在的位置 2.配置Tomcat window-----preferences------- 找到自己的tomcat所在位置 ...
- windows环境VS2015编译TensorFlow C++程序完全攻略
本文参考和综合了多篇网络博客文章,加以自己的实践,最终终于在windows环境下,编译出可以用于C++程序调用tensorflow API的程序,并执行成功. 考虑到网络上关于这方面的资料还较少,特总 ...
- 网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器
网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器 网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器 论述当下网络时间同步的重要性 北京华人开创科技发展有限公 ...
- Elasticsearch Head插件实践
简介 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Ap ...
- 关于ORM的浴室思考
这是一个由EF群引发的随笔 平时在一个EF群摸鱼,日常问题可以归纳为以下几种: 这条sql用linq怎么写? EF可以调用我写的存储过程么? EF好慢啊一些复杂查询写起来好麻烦-- 为什么会有这些问题 ...
- ASP.NET 设计模式:设计模式和原则简述
设计模式的概念 设计模式是高层次的.抽象的解决方案模板.可以将这些模式视为解决方案的蓝本而不是解决方案本身.通常是通过重构自己的代码并将问题泛化来实现设计模式. 软件设计中常见的模式大体分为三类: 创 ...