今天课上老师提了提长整数的代数运算,恰巧之前做题也碰到过几次,就顺便写一下吧
最最常用的是加法和乘法,但一家人就要整整齐齐就都整理了吧23333
P1601 A+B Problem(高精)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=510;
char a1[maxn],b1[maxn];
int a[maxn],b[maxn],c[maxn+10],carry=0;
int main()
{
scanf("%s%s",a1,b1);
int len1=strlen(a1),len2=strlen(b1);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=0;i<len1;i++)
a[i]=a1[len1-i-1]-'0';
for(int i=0;i<len2;i++)
b[i]=b1[len2-i-1]-'0';
int len=max(len1,len2);
for(int i=0;i<len;i++){
c[i]+=a[i]+b[i]+carry;
if(c[i]>9){
carry=1;
c[i]-=10;
}
else
carry=0;
}
if(carry==1){
c[len++]=1;
}
for(int i=len-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
return 0;
}
P2142 高精度减法
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=10090;
char a1[maxn],b1[maxn],tmp[maxn];
int a[maxn],b[maxn],c[maxn];
bool cmp(char x[],char y[]){
if(strlen(x)!=strlen(y)) return strlen(x)<strlen(y);
for(int i=0;i<strlen(x);i++){
if(x[i]!=y[i])
return x[i]<y[i];
}
return false;
}
int main()
{
scanf("%s%s",a1,b1);
if(cmp(a1,b1)){
strcpy(tmp,a1);
strcpy(a1,b1);
strcpy(b1,tmp);
printf("-");
}
int len1=strlen(a1),len2=strlen(b1);
int len=max(len1,len2);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=0;i<len1;i++)
a[i]=a1[len1-i-1]-'0';
for(int i=0;i<len2;i++)
b[i]=b1[len2-i-1]-'0';
for(int i=0;i<len1||i<len2;i++){
if(a[i]<b[i]){
a[i+1]-=1;
c[i]=a[i]+10-b[i];
}
else{
c[i]=a[i]-b[i];
}
}
while(c[len-1]==0&&len>1)
len--;
for(int i=len-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
return 0;
}
P1303 A*B Problem(高精)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=2010;
char a1[maxn],b1[maxn];
int a[maxn],b[maxn],c[2*maxn],len,len1,len2;
int main()
{
scanf("%s%s",a1,b1);
len1=strlen(a1),len2=strlen(b1);
len=len1+len2;
memset(c,0,sizeof(c));
for(int i=0;i<len1;++i)
a[i]=a1[len1-i-1]-'0';
for(int i=0;i<len2;++i)
b[i]=b1[len2-i-1]-'0';
for(int i=0;i<len1;++i){
for(int j=0;j<len2;j++){
c[i+j]+=a[i]*b[j];
}
}
for(int i=0;i<len-1;++i){
if(c[i]>9){
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
while(c[len-1]==0&&len>1)
len--;
for(int i=len-1;i>=0;--i)
printf("%d",c[i]);
printf("\n");
return 0;
}
高精度除法
除法不怎么常用,懒得写了,贴一个别人的
https://www.cnblogs.com/Hankercat/p/10331701.html
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=1010;
int a[maxn],b[maxn],c[maxn],i;
//输入函数
void init(int a[]){
string s;
cin>>s;
a[0]=s.length();
for(i=1;i<=a[0];i++)
a[i]=s[a[0]-i]-'0';//减法倒序存储
}
//输出函数
void print(int a[]){
int i;
if(a[0]==0){
cout<<0<<endl;
return;
}
for(i=a[0];i>0;i--)
cout<<a[i];
cout<<endl;
return; //函数执行完毕回到主程序
}
//比较函数
int cmp(int a[],int b[]){
int i;
if(a[0]>b[0])
return 1;
if(a[0]<b[0])
return-1;
for(i=a[0];i>0;i--){ //如果两数位数相等,则按位比大小
if(a[i]>b[i])
return 1;
if(a[i]<b[i])
return -1; //按位比较若该位数相同,则判断下一位
}
return 0;//如果返回0则表示两数相等
}
//减法模拟除法
void sub(int a[],int b[]){
int flag,i;
flag=cmp(a,b);
if(flag==0){
a[0]=0;
return;
}
if(flag==1){
for(i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]=a[i]+10;
}
a[i]-=b[i];
}
while(a[0]>0&&a[a[0]]==0)
a[0]--;
return;
}
}
//复制数组
void numcpy(int p[],int q[],int det){
for(int i=1;i<=p[0];i++)
q[i+det-1]=p[i];
q[0]=p[0]+det-1;
}
//除法计算
void div(int a[],int b[],int c[]){
int i,tmp[maxn];
c[0]=a[0]-b[0]+1; //商的位数不超过被除数的位数-除数的位数+1
for(i=c[0];i>0;i--){ //每次循环确定某位商的的值,从高位开始
memset(tmp,0,sizeof(tmp));
numcpy(b,tmp,i);
while(cmp(a,tmp)>=0){
c[i]++;
sub(a,tmp);
}
}
while(c[0]>0&&c[c[0]]==0)
c[0]--;
return;
}
//主函数
int main(){
init(a);
init(b);
div(a,b,c);
print(c);
print(a);
return 0;
}