高精度算法
加法
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1000],b[1000],ans[1000];
void read(int *a,int &len){
char strl[1000];
scanf("%s",strl);
len=strlen(strl);
int top=len-1;
for (int i=0;i<len;i++) a[top--]=strl[i]-'0';
}
int main(){
int len1;
int len2;
read(a,len1);
read(b,len2);
int len;
len=max(len1,len2);
int c=0;
for (int i=0;i<=len;i++){
ans[i]=a[i]+b[i]+c;
if(ans[i]>9) {
c=ans[i]/10;
ans[i]%=10;
}
else c=0;
}
while(ans[len]!=0) len++;
for (int i=len-1;i>=0;i--)
printf("%d",ans[i]);
return 0;
}
减法
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[10009],b[10009],ans[10009];
char strl1[10009],strl2[10009];
int main(){
int len1;
int len2;
scanf("%s",strl1);
scanf("%s",strl2);
len1=strlen(strl1);
len2=strlen(strl2);
if(len1>len2){
int top=len1-1;
for (int i=0;i<len1;i++)
a[top--]=strl1[i]-'0';
top=len2-1;
for (int i=0;i<len2;i++)
b[top--]=strl2[i]-'0';
}
else if(len1==len2){
if(strcmp(strl1,strl2)>0){
int top=len1-1;
for (int i=0;i<len1;i++)
a[top--]=strl1[i]-'0';
top=len2-1;
for (int i=0;i<len2;i++)
b[top--]=strl2[i]-'0';
}
else if(strcmp(strl1,strl2)==0)
{
printf("0");
return 0;
}
else {
int top=len1-1;
for (int i=0;i<len1;i++)
b[top--]=strl1[i]-'0';
top=len2-1;
for (int i=0;i<len2;i++)
a[top--]=strl2[i]-'0';
printf("-");
}
}
else {
int top=len1-1;
for (int i=0;i<len1;i++)
b[top--]=strl1[i]-'0';
top=len2-1;
for (int i=0;i<len2;i++)
a[top--]=strl2[i]-'0';
printf("-");
}
int len;
len=max(len1,len2);
int c=0;
for (int i=0;i<=len;i++){
ans[i]=a[i]-b[i]-c;
if(ans[i]<0) {
c=1;
ans[i]+=10;
}
else c=0;
}
while(ans[len-1]==0&&len>1) len--;
for (int i=len-1;i>=0;i--)
printf("%d",ans[i]);
return 0;
}
乘法
#include<stdio.h>
#include<string.h>
int a[3005],b[3005],ans[6000];
void read(int *A,int &len){
char strl1[3005];
scanf("%s",strl1);
len=strlen(strl1);
int top=len-1;
for (int i=0;i<len;i++)
A[top--]=strl1[i]-'0';
}
int main(){
int len1;
int len2;
read(a,len1);
read(b,len2);
if(a[len1-1]==0||b[len2-1]==0) {
printf("0");
return 0;
}
for (int i=0;i<len1;i++){
for (int j=0;j<len2;j++){
ans[i+j]+=a[i]*b[j];
}
}
int len=len1+len2-1;
for (int i=0;i<len;i++){
if(ans[i]>9) {
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
}
while(ans[len]) len++;
for (int i=len-1;i>=0;i--)
printf("%d",ans[i]);
return 0;
}
除法
#include<stdio.h>
#include<string.h>
const int maxn=5005;
int a[maxn],b[maxn],c[maxn],ans[maxn];
void read(int *A){
char strl1[maxn];
int top;
scanf("%s",strl1);
A[0]=strlen(strl1);
top=A[0]+1;
for (int i=0;i<A[0];i++)
A[--top]=strl1[i]-'0';
}
bool check(){
if(c[0]>b[0]) return true;
if(c[0]<b[0]) return false;
for (int i=c[0];i>=1;i--)
{
if(c[i]<b[i]) return false;
else if(c[i]>b[i]) return true;
}
return true;
}
void jian(){
int f=0;
int t=0;
for (int i=1;i<=c[0];i++){
c[i]-=b[i]+t;
if(c[i]<0) {
c[i]+=10;
t=1;
}
else t=0;
}
while(c[c[0]]==0&&c[0]>1) c[0]--;
if(c[0]==1&&c[1]==0) c[0]--;
}
void print(int *A){
for (int i=A[0];i>=1;i--)
printf("%d",A[i]);
printf("\n");
}
int main(){
read(a);
read(b);
c[0]=0;
for (int i=a[0];i>=1;i--){
for (int j=c[0];j>=1;j--) c[j+1]=c[j];
c[1]=a[i];
c[0]++;
if(c[1]==0&&c[0]==1) c[0]--;
while(check()){
jian();
ans[i]++;
}
}
ans[0]=a[0];
while(ans[0]>1&&ans[ans[0]]==0) ans[0]--;
print(ans);
if(c[0]==0) printf("0");
while(c[0]>1&&c[c[0]]==0) c[0]--;
print(c);
return 0;
}