高精度可以直接使用java,java的相关基础知识还需要掌握
如果使用c++就要用字符串形式读入,然后转化为数字数组模拟手算过程,一般0号元素记录数组的长度
高精度的储存:
注意是倒序存储
void init(int a[]){
string s;
cin>>s;//读入字符串s
a[0]=s.length();//用a[0]计算字符串s的位数
for(i=1;i<=a[0];i++)
a[i]=s[a[0]-i]-'0';//将数串s转换为数组a,并倒序存储.
}
高精度数的比较
int compare (int a[],int b[]){
if (a[0]>b[0]) return 1;//a的位数大于b则a比b大
if (a[0]0;i--) //从高位到低位比较
{ if (a[i]>b[i]) return 1;
if (a[i]
高精度输出:
void print(int a[]) {
int i;
if (a[0]==0){
cout<<0<0;i--) cout<
高精度加法:
void jia(int a[],int b[]) {//计算a=a+b
int i,k;
if(a[0]0) a[0]++;//修正新的a的位数(a+b最多只能的一个进位)
}
如果是n进制的运算:
1、当前位规范由%10改为% n
2、进位处理由/10改为/n
3、其他运算规则不变
高精度减法:
void jian(int a[],int b[]){
int flag,i;
flag=compare(a,b); //调用比较函数判断大小
if (flag==0) {
a[0]=0;
return;
}//相等
for(i=1;i<=a[0];i++) {
if(a[i]
高精度乘单精度:
int chengshu(int a[],int k) {
int i;
if(k==0){for(i=0;i<=101;i++)a[i]=0;a[0]=0;return 0;} //处理k=0
for(i=1;i<=a[0];i++)a[i]=a[i]*k;//先每位乘起来
for(i=1;i<=a[0];i++) {//进位
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(a[a[0]+1]>0){//处理最高位相乘的进位
a[0]++;
a[a[0]+1]=a[a[0]]/10;
a[a[0]]=a[a[0]]%10;
}
return 0;
}
高精度乘高精度
void cheng (int a[],int b[],int c[]){
int i,j,len;
for (i=1;i<=a[0];i++)
for (j=1;j<=b[0];j++){
c[i+j-1]+=a[i]*b[j];
}
c[0]=a[0]+b[0];
for(i=1;i<=c[0];i++){//进位
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[0]>0&&c[c[0]]==0)c[0]--;
return ;
}
高精度除单精度 (从高位开始除,和前面三种运算不同)
void chushu(int a[],int b,int c[],int d){//c=a/b,d=a%b
int i;
d=0; //余数初始化
for(i=a[0];i>=1;i--){//按照由高位到底位的顺序,逐位相除
d=d*10+a[i]; //接受了来自第i+1位的余数
c[i]=d/b; //计算商的第i位
d=d%b;
}//计算第i位的余数
c[0]=a[0];
while(c[0]>0&&c[c[0]]==0)c[0]--;//计算商的有效位数
return ;
}
高精度除高精度
void chu(int a[],int b[],int c[]){
int i,j,tmp[101];
c[0]=a[0]-b[0]+1;
for (i=c[0];i>0;i--){
memset(tmp,0,sizeof(tmp));//数组清零
numcpy(b,tmp,i); //将b拷贝到tmp的第i位,其余位是0
while(compare(a,tmp)>=0){
c[i]++;
jian(a,tmp);
}//用减法来模拟
}
while(c[0]>0&&c[c[0]]==0)c[0]--;
return ;
}