一、高精度读取
#include <string.h>
int a[MAXN],b[MAXN];
char stra[MAXN],strb[MAXN];
void read(void){
cin >> stra >> strb;
int lena = strlen(stra);
int lenb = strlen(strb);
for(int i=0;i<lena;i++) a[lena-i] = stra[i]-'0';
for(int i=0;i<lenb;i++) b[lenb-i] = strb[i]-'0';
}
二、高精度加法
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define MAXN 501
int a[MAXN],b[MAXN],c[MAXN];
char stra[MAXN],strb[MAXN];
int lena,lenb,lenc;
void read(void){
cin >> stra >> strb;
lena = strlen(stra);
lenb = strlen(strb);
for(int i=0;i<lena;i++) a[lena-i] = stra[i]-'0';
for(int i=0;i<lenb;i++) b[lenb-i] = strb[i]-'0';
}
void add(int *a, int *b){
lenc = max(lena,lenb);
for(int i=1;i<=lenc;i++){
c[i] += a[i] + b[i];
c[i+1] += c[i]/10;
c[i] %= 10;
}
if(c[lenc+1] != 0) lenc++;
}
int main(void){
read();
add(a,b);
for(int i=lenc;i>=1;i--) cout << c[i];
return 0;
}
三、高精度减法
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define MAXN 20000
int a[MAXN],b[MAXN],c[MAXN];
string stra,strb;
int lena,lenb,lenc;
bool flag;
void read(void){
cin >> stra >> strb;
lena = stra.size();
lenb = strb.size();
if(stra<strb&&lena==lenb || lena<lenb){
swap(stra,strb);
swap(lena,lenb);
flag = 1;
}
for(int i=0;i<lena;i++) a[lena-i] = stra[i]-'0';
for(int i=0;i<lenb;i++) b[lenb-i] = strb[i]-'0';
}
void sub(int *a, int *b){
lenc = max(lena,lenb);
for(int i=1;i<=lenc;i++){
if(a[i] < b[i]){
a[i+1]--;
a[i] += 10;
}
c[i] = a[i]-b[i];
}
while(c[lenc]==0 && lenc>1) lenc--;
}
int main(void){
read();
sub(a,b);
if(flag) cout << "-";
for(int i=lenc;i>=1;i--) cout << c[i];
return 0;
}
四、高精度乘法
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define MAXN 2000
int a[MAXN],b[MAXN],c[MAXN];
char stra[MAXN],strb[MAXN];
int lena,lenb,lenc;
bool flag;
void read(void){
cin >> stra >> strb;
lena = strlen(stra);
lenb = strlen(strb);
for(int i=0;i<lena;i++) a[lena-i] = stra[i]-'0';
for(int i=0;i<lenb;i++) b[lenb-i] = strb[i]-'0';
}
void time(int *a, int *b){
int x=0;
for(int i=1;i<=lena;i++){
x = 0;
for(int j=1;j<=lenb;j++){
lenc = i+j-1;
c[lenc] += a[i]*b[j]+x;
x = c[lenc]/10;
c[lenc] %= 10;
}
c[lenc+1] += x;
}
while(c[lenc+1]) lenc++;
}
int main(void){
read();
mul(a,b);
for(int i=lenc;i>=1;i--) cout << c[i];
return 0;
}
五、高精度除法
找不到题目进行评测,所以暂时无法保证代码准确性。
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define MAXN 20000
int a[MAXN],b[MAXN],c[MAXN];
char stra[MAXN],strb[MAXN];
int lena,lenb,lenc,ans;
void read(void){
cin >> stra >> strb;
lena = strlen(stra);
lenb = strlen(strb);
for(int i=0;i<lena;i++) a[lena-i] = stra[i]-'0';
for(int i=0;i<lenb;i++) b[lenb-i] = strb[i]-'0';
}
int judge(int *a, int *b){
if(lena < lenb) return 1;
for(int i=lena;i>0;i--){
if(a[i] > b[i]) return 0;
if(a[i] < b[i]) return 1;
}
return 0;
}
void sub(int *a, int *b){
lenc = max(lena,lenb);
for(int i=1;i<=lenc;i++){
if(a[i] < b[i]){
a[i+1]--;
a[i] += 10;
}
c[i] = a[i]-b[i];
}
while(c[lenc]==0 && lenc>1) lenc--;
}
void div(int *a, int *b){
while(!judge(a,b)){
sub(a,b);
ans++;
for(int i=1;i<=lenc;i++){
a[i] = c[i];
}
lenb = lenc;
}
}
int main(void)
{
read();
if(judge(a,b) || !a[lena] || !b[lenb]){
cout << "0";
return 0;
}
div(a,b);
cout << ans;
return 0;
}