基础高精度
Posted tbdemons
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础高精度相关的知识,希望对你有一定的参考价值。
小学奥数由于太简单 先咕了
写一下高精度吧...
先贴上两种代码
第一种 easy版本
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
char a1[1000],b1[1000];
int a[1000],b[1000],c[1000],lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",a1);scanf("%s",b1);//scanf就爆0!
lena=strlen(a1);
lenb=strlen(b1);
for(i=0;i<=lena-1;i++)
a[lena-i]=a1[i]-48;
for(i=0;i<=lenb-1;i++)
b[lenb-i]=b1[i]-48;
lenc=1;
x=0;
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
if(c[lenc]==0)
lenc--;
for(i=lenc;i>=1;i--)
cout<<c[i];
cout<<endl;
return 0;
}这个应该很好理解,以后贴上注释...
下面介绍另一种 重载运算符高精度+-*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=100000000,
P=8; //压位
struct bignum
{
int n[5000],l; //n数组存放每个结构体中的"大数",l记录长度。
bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
void init() //输入过程
{
string s;
cin>>s;
int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10
for(int i=s.length()-1;i>=0;i--) //从s的长度-1开始
{
n[now]+=(s[i]-‘0‘)*c1;
c1*=10;
ct++;
if(ct==P&&i!=0) // 如果i=0了就没有必要now++;
{
now++;
ct=0;
c1=1;
}
}
l=now+1; //l的长度为now+1;
}
void print()
{
printf("%d",n[l-1]);
for(int i=l-2;i>=0;i--)
printf("%0*d",P,n[i]); //补零输出
printf("\n");
}
//-----------------------------------------------
bignum operator + (bignum x) const //重载加号
{
bignum t=*this;
if(x.l>t.l)t.l=x.l;
for(int i=0;i<t.l;i++)
{
t.n[i]+=x.n[i];
if(t.n[i]>=M)
{
t.n[i+1]+=t.n[i]/M;
t.n[i]%=M;
}
}
return t; // 注意:将t的值返回
}
//------------------------------------------------
bool operator < (bignum x) const //重载小于号
{
bignum t=*this;
if(t.l!=x.l)return t.l<x.l;
for(int i=t.l-1;i>=0;i--)
{
if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
}
return 0;
}
bignum operator -(bignum x) const //重载减号
{
bignum t=*this;
if(t<x){printf("-");swap(t,x);}
int jie =0;
for(int i=0;i<t.l;i++)
{
t.n[i]-=x.n[i];
while(t.n[i]<0)
{
t.n[i]+=M;
jie++;
}
t.n[i+1]-=jie;
jie=0;
}
while(!t.n[t.l-1] && t.l>1)t.l--; // 相减后有可能出现前面有0的情况,所以t.l--;
return t;
}
//----------------------------------------------
}a,b,c;
int main()
{
a.init(); //读入字符串a和b
b.init();
c=a+b;
c.print();
c=a-b;
c.print();
c=a*b;
c.print();
return 0;
}
注释咕咕咕
以上是关于基础高精度的主要内容,如果未能解决你的问题,请参考以下文章