高精度小貼士:
除法/減法從最高位開始,乘法/加法從最低位開始;
高精度的實質是模拟,注意邊界/進位/退位等等。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s1[], s2[];
int x, lenf, leng, f[], g[], temp[]; //f[1]存個位
void add() {//如果是單精就搞成高精>~<我不管我不管!!
scanf("%s", s1);
scanf("%s", s2);
lenf = strlen(s1);
for(int i = ; i < lenf; i ++)
f[lenf - i] = s1[i] - '0';
leng = strlen(s2);
for(int i = ; i < leng; i ++)
g[leng - i] = s2[i] - '0';
int len = max(lenf, leng);
for(int i = ; i <= len; i ++) {
if(f[i] + g[i] > ) f[i + ] ++;
f[i] = (f[i] + g[i]) % ;
}
if(f[len + ]) len ++;
for(int i = len; i >= ; i --) printf("%d", f[i]);
}
void mul() { //高精乘單精
scanf("%s", s1);
scanf("%d", &x);
lenf = strlen(s1);
for(int i = ; i < lenf; i ++)
f[lenf - i] = s1[i] - '0', f[lenf - i] *= x;
for(int i = ; i <= lenf; i ++) {
if(f[i] > )
f[i + ] += f[i] / , f[i] %= ;
}
while(f[lenf + ]) {
lenf ++;
f[lenf + ] += f[lenf] / ; f[lenf] %= ;
}
for(int i = lenf; i >= ; i --) printf("%d", f[i]);
}
void big_mul() { //高精乘高精
scanf("%s", s1);
scanf("%s", s2);
lenf = strlen(s1);
for(int i = ; i < lenf; i ++)
f[lenf - i - ] = s1[i] - '0';
leng = strlen(s2);
for(int i = ; i < leng; i ++)
g[leng - i - ] = s2[i] - '0';
int mmax = , len = ;
for(int i = ; i < lenf; i ++)
for(int j = ; j < leng; j ++) {
temp[i + j - ] += f[i] * g[j];
if(temp[i + j - ]) mmax = i + j - ;
}
for(int i = ; i <= mmax + ; i ++) {
temp[i + ] += temp[i] / ;
temp[i] %= ;
if(temp[i]) len = i;
}
for(int i = len; i >= ; i --) printf("%d", temp[i]);
}
void div() {//高精除單精
scanf("%s", s1);
scanf("%d", &x);
lenf = strlen(s1);
for(int i = ; i < lenf; i ++)
f[lenf - i] = s1[i] - '0';
int mod = ;
for(int i = lenf; i >= ; i --) {
temp[i] = (f[i] + mod * ) / x;
mod = (f[i] + mod * ) % x;
}
int i = lenf;
for(; !temp[i]; i --);
for(; i; i --) printf("%d", temp[i]);
}
int main() {
add(); mul(); big_mul(); div();
return ;
}