定义:
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。——百度百科
引入:
实现一个计算器能够计算+-*/四种运算,且计算的数可以超出long long的范围。
存储:
在平常的实现中,高精度数字利用字符串表示,每一个字符表示数字的一个十进制位。因此可以说,高精度数值计算实际上是一种特别的字符串处理。
读入字符串时,数字最高位在字符串首(下标小的位置)。但是习惯上,下标最小的位置存放的是数字的 最低位,即存储反转的字符串。这么做的原因在于,数字的长度可能发生变化,但我们希望同样权值位始终保持对齐。
此后我们将一直沿用这一约定。定义一个常数 LEN = 1004
表示程序所容纳的最大长度。
简单实现:
void clear(int a[]){
for(int i=0;i<LEN;i++) a[i]=0;
}
void read(int a[]){
char s[LEN+1];
scanf("%s",s);
clear(a);
int len_s=strlen(s);
// 如上所述,反转
for(int i=0;i<len_s;i++) a[len_s-i-1]=s[i]-'0';
// s[i] - '0' 就是 s[i] 所表示的数码
}
输出也按照存储的逆序输出。由于不希望输出前导零,故这里从最高位开始向下寻找第一个非零位,从此处开始输出;终止条件 i >= 1
而不是 i >= 0
是因为当整个数字等于 0 时仍希望输出一个字符 0
。
void print(int a[]){
int i;
for(i=LEN-1;i>=1;i--)
if(a[i]!=0) break;
for(;i>=0;i--) putchar(a[i]+'0');
putchar('\n');
}
拼起来就是一个完整的复读机程序咯。
#include<bits/stdc++.h>
using namespace std;
const int LEN=1004;
int a[LEN],b[LEN];
void clear(int a[]){
for(int i=0;i<LEN;i++) a[i]=0;
}
void read(int a[]){
char s[LEN+1];
scanf("%s",s);
clear(a);
int len_s&#