其实都是模拟人常规的加减乘除方法。
加:
数组输入,翻转对齐,对位相加,进位处理
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAXN 10000
int a1[MAXN],b1[MAXN];
char a[MAXN],b[MAXN];
int main(){
int len2,len1,i,j;
while(scanf("%s",a)!=EOF){//数组输入
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
j=0;
for(i=len1-1;i>=0;i--)//翻转对齐
a1[j++]=a[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
b1[j++]=b[i]-'0';
for(i=0;i<max(len1,len2);i++)//对位相加
a1[i]+=b1[i];
int flag=0; //进位处理
for(i=0;i<=max(len1,len2);i++){
a1[i]+=flag;
flag=a1[i]/10;
a1[i]%=10;
}
flag=a1[max(len1,len2)];
for(i=max(len1,len2)+flag-1;i>=0;--i)
cout<<a1[i];
cout<<endl;
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
}
return 0;
}
减:
数组输入,翻转对齐,对位相减,退位处理
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAXN 10000
int a1[MAXN],b1[MAXN];
char a[MAXN],b[MAXN];
int main(){
int len2,len1,i,j;
while(scanf("%s",a)!=EOF){//数组输入
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
j=0;
for(i=len1-1;i>=0;i--)//翻转对齐
a1[j++]=a[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
b1[j++]=b[i]-'0';
for(i=0;i<max(len1,len2);i++)//对位相减
a1[i]-=b1[i];
int flag=0; //退位处理
for(i=0;i<max(len1,len2)-1;i++){
a1[i]-=flag;
if(a1[i]<0)
{
flag=1;
a1[i]+=10;
}
else flag=0;
}
flag=a1[max(len1,len2)-1];
for(i=flag==0?max(len1,len2)-2:max(len1,len2)-1;i>=0;--i)
cout<<a1[i];
cout<<endl;
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
}
return 0;
}
乘:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAXN 10000
int a1[MAXN],b1[MAXN],a11[MAXN];
char a[MAXN],b[MAXN];
int main(){
int len2,len1,i,j,k,t;
while(scanf("%s",a)!=EOF){//数组输入
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
int num=0;j=0;
for(i=len1-1;i>=0;i--){
num++;
a1[j]=a1[j]+(a[i]-'0')*pow(10,num-1);
if(num==4)
{
j++;
num=0;
}
}
if(len1%4==0)
len1=j;
else len1=j+1;
num=0;j=0;
for(i=len2-1;i>=0;i--){
num++;
b1[j]=b1[j]+(b[i]-'0')*pow(10,num-1);
if(num==4)
{
j++;
num=0;
}
}
if(len2%4==0)
len2=j;
else len2=j+1;
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
a11[i+j]=a11[i+j]+a1[i]*b1[j];
int flag=0;
for(i=0;i<len1+len2;i++){
a11[i]+=flag;
flag=a11[i]/10000;
a11[i]%=10000;
}
t=len1+len2-1;
flag=a11[t];
while(!flag){
t--;
flag=a11[t];
}
cout<<a11[t];
for(i=t-1;i>=1;--i)
printf("%04d",a11[i]);
if(t!=0){
if(len1+len2-2==0&&flag==0) cout<<a11[0];
else printf("%04d",a11[0]);
}
cout<<endl;
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
memset(a11,0,sizeof(a11));
}
return 0;
}
除
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int ans[210],a[210],b[210],n,lena,lenb,lenans,jian[210],tmp[210];
char a1[210],b1[210];
void func(char a[],int b[]){//处理
for(int i=0;i<strlen(a);i++){
b[i]=a[i]-'0';
}
}
bool check(int a[],int b[]){//是否可再减
for(int i=0;i<lenb;i++){
if(a[i]<b[i]){
return false;
}
if(a[i]>b[i]){
return true;
}
}
return true;
}
int Minus(int a[],int b[]){//把除法当减法做
for(int i=0;i<lenb;i++){
tmp[i]=a[i];
}
int ti=0;
while(true){
if(!check(tmp,b)){
break;
}
ti++;//减了一次
for(int i=0;i<lenb;i++){
tmp[i]-=b[i];
}
for(int i=lenb-1;i>0;i--){
if(tmp[i]<0){
tmp[i]+=10;
tmp[i-1]--;
}
}
for(int i=0;i<lenb;i++){
a[i]=tmp[i];
}
}
return ti;
}
int main(){
cin>>n;
getchar();
while(n--){
lenans=0;
memset(a1,0,sizeof(a1));
memset(a,0,sizeof(a));
memset(b1,0,sizeof(b1));
memset(b,0,sizeof(b));
memset(ans,0,sizeof(ans));
scanf("%s%s",&a1,&b1);
lenb=strlen(b1);
lena=strlen(a1);
func(a1,a);
func(b1,b);
while(lenans+lenb<=lena){
memset(jian,0,sizeof(jian));
for(int i=lenans,j=0;j<lenb;j++,i++){
jian[j]=a[i];
}
ans[lenans]=Minus(jian,b);
for(int i=lenans,j=0;j<lenb;j++,i++){
a[i]=jian[j];
}
a[lenans+1]+=a[lenans]*10;
lenans++;
for(;lenans+lenb<=lena;lenans++){
if(a[lenans]!=0){
break;
}
}
}
if(lenans==0){
cout<<0<<endl;
}
else{
int i=0;
for(i=0;i<lenans;i++){
if(ans[i]){
break;
}
}
for(;i<lenans;i++){
cout<<ans[i];
}
cout<<endl;
}
}
return 0;
}