高精加
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
using namespace std;
const int N=100000;
string sta,stb;
int a[N+1],b[N+1],len;
void Init(int a[],string &st)
{
cin>>st,a[0]=st.size();
FORa(i,1,a[0]) a[i]=st[a[0]-i]-'0';
}
int main()
{
Init(a,sta),Init(b,stb),len=a[0]>b[0]?a[0]:b[0]+1;//记得判断两者解的长度
FORa(i,1,len) a[i]+=b[i],a[i+1]+=a[i]/10,a[i]%=10;
while(!a[len]&&len>1) len--;//删除前导零
FORs(i,len,1) printf("%d",a[i]);
return 0;
}
高精减
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
using namespace std;
const int N=100000;
int a[N+1],b[N+1];
string sta,stb;
void Init(int a[],string &st)
{
cin>>st,a[0]=st.size();
FORa(i,1,a[0]) a[i]=st[a[0]-i]-'0';
}
int main()
{
Init(a,sta),Init(b,stb);
FORa(i,1,a[0])
{
a[i]-=b[i];
if(a[i]<0) a[i+1]--,a[i]+=10;//借位
}
while(!a[a[0]]&&a[0]>1) a[0]--;//删除前导零
FORs(i,a[0],1) printf("%d",a[i]);
return 0;
}
高精乘
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
using namespace std;
const int N=1000;
int a[N+1],b[N+1],c[N+1];
string sta,stb;
void Init(int p[],string &s)
{
cin>>s,p[0]=s.size();
FORa(i,1,p[0]) p[i]=s[p[0]-i]-'0';
}
int main()
{
Init(a,sta),Init(b,stb);
FORa(i,1,a[0])
{
int x=0;
FORa(j,1,b[0])
c[i+j-1]=a[i]*b[j]+c[i+j-1]+x,x=c[i+j-1]/10,c[i+j-1]%=10;//加上本身与前者的进位与本应该加上的值
c[i+b[0]]=x;//别忘记处理进位的小尾巴
}
c[0]=a[0]+b[0]+1;
while(!c[c[0]]&&c[0]>1) c[0]--;//删除前导零
FORs(i,c[0],1) printf("%d",c[i]);
return 0;
}
高精除
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
using namespace std;
const int N=1000;
int a[N+1],b,c[N+1];
string s;
void Init(int p[],string &s)
{
cin>>s,p[0]=s.size();
FORa(i,1,p[0]) p[i]=s[i-1]-'0';//存储方式与其它高精度处理不一样,正序储存
}
int main()
{
int x=0;
Init(a,s),scanf("%d",&b);
FORa(i,1,a[0])
{
c[i]=(x*10+a[i])/b;//注意商与余数要继承之前的答案
x=(x*10+a[i])%b;
}
int sp=1;
while(!c[sp]&&sp<a[0]) sp++;//删除前导零,但因为储存方式的不一样,删除的方式也不一样
FORa(i,sp,a[0]) printf("%d",c[i]);
return 0;
}