高精度加法
//简单高精度加法 不考虑符号
const int N=100;
int len,a[N+1],b[N+1];
void Init(int a[])
{
string s;
cin>>s,a[0]=s.size();
FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0'; //逆序储存
}
void Solve()
{
len=a[0]>b[0]?a[0]:b[0],len++; //注意答案的位数
FORa(i,1,len)
{
a[i]+=b[i];
if(a[i]>=0) a[i+1]+=a[i]/10,a[i]%=10;//最好不要这样写(a[i+1]+=a[i]/10,a[i]%=10),这样会无形增加时间复杂度
}
while(!a[len]&&len>1) len--; //以防输出无答案
FORs(i,len,1) printf("%d",a[i]);//因为储存的问题,逆序输出
}
int main()
{
Init(a),Init(b),Solve();
return 0;
}
高精度减法
const int N=100;
int len,a[N+1],b[N+1];
void Init(int a[])
{
string s;
cin>>s,a[0]=s.size();
FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0';
}
void Solve()
{
len=a[0];
FORs(i,a[0],1)
{
a[i]-=b[i];
if(a[i]<0) a[i+1]--,a[i]+=10;
}
while(!a[len]&&len>1) len--;
FORs(i,len,1) printf("%d",a[i]);
}
int main()
{
Init(a),Init(b),Solve();
return 0;
}
高精度乘法
const int N=100;
int len,a[N+1],b[N+1],c[2*N+2];
void Init(int a[])
{
string s;
cin>>s,a[0]=s.size();
FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0';
}
void Solve()
{
len=a[0]+b[0]+1;
FORa(i,1,a[0])
FORa(j,1,b[0])
c[i+j-1]+=a[i]*b[j]; //在科学文社出版社出版的信息学奥赛一本通中(新手推荐),简单高精好像有一点问题。
FORa(i,1,len) if(c[i]>=10) c[i+1]+=c[i]/10,c[i]%=10; //先处理,后进位
while(!c[len]&&len>1) len--;
FORs(i,len,1) printf("%d",c[i]);
}
int main()
{
Init(a),Init(b),Solve();
return 0;
}
高精度除法
const int N=100;
int len,a[N+1],c[N+1],b;
void Init(int a[])
{
string s;
cin>>s,a[0]=s.size();
FORa(i,1,a[0]) a[i]=s[a[0]-i]-'0';
}
void Solve()
{
int x=0,len=a[0];
FORs(i,a[0],1) x=(x*10+a[i]),c[i]=x/b,x%=b; //注意解决方式与加减乘不同,需要从头开始,
while(!c[len]&&len>1) len--;
FORs(i,len,1) printf("%d",c[i]);
printf("\n%d",x);
}
int main()
{
Init(a),scanf("%d",&b),Solve();
return 0;
}