大数的处理这里均采用模拟的方法。
1.大数相加
c[i]=a[i]+b[i];
c[i+1]=c[i]/10+c[i+1];
c[i]=c[i]%10;
******************************************
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char str1[510],str2[510];
int a[510],b[510],c[510];
int Add(char str1[],char str2[]);
int main()
{
int test;
cin>>test;
while(test--)
{
memset(str1,0,510);
memset(str2,0,510);
memset(a,0,510);
memset(b,0,510);
memset(c,0,510);
cin>>str1>>str2;
int max=Add(str1,str2);
for(int i=max;i>=0;--i)
cout<<c[i];
cout<<endl;
}
system("pause");
return 0;
}
int Add(char str1[],char str2[])
{
int count=0;
int m=strlen(str1);
int n=strlen(str2);
int max=m>n?m:n;
int i,j,k;
for(i=0;i<m;++i) a[m-i-1]=str1[i]-48; //转换为int型
for(j=0;j<n;++j) b[n-j-1]=str2[j]-48;
for(k=0;k<max;++k) c[k]=a[k]+b[k];
for(i=0;i<max;++i)
{
c[i+1]=c[i]/10+c[i+1];
c[i]=c[i]%10;
}
if(c[max]==0) count=max-1;
else
count=max;
}
2.减法
直接相减,如果为负,则向前借一位.
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char str1[1000],str2[1000];
int a[1000],b[1000],c[1000];
void Subtraction(char str1[],char str2[]) //a>b
{
int m=strlen(str1);
int n=strlen(str2);
int max=m>n?m:n;
int i,j;
for(i=0;i<m;++i) a[m-i-1]=str1[i]-48;
for(j=0;j<n;++j) b[n-j-1]=str2[j]-48;
for(i=0;i<max;++i)
{
a[i]=a[i]-b[i];
if(a[i]<0)
{
a[i]+=10;
a[i+1]--;
}
}
if(a[max-1]==0)
max=max-2;
else
max=max-1;
for(j=max;j>=0;j--)
cout<<a[j];
cout<<endl;
}
int main()
{
cin>>str1>>str2;
Subtraction(str1,str2);
system("pause");
return 0;
}
3.乘法
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1010],b[1010],c[1010];
char str1[510],str2[510];
void Multiplication(char str1[],char str2[]);
int main()
{
while(cin>>str1>>str2)
{
Multiplication(str1,str2);
}
system("pause");
return 0;
}
void Multiplication(char str1[],char str2[])
{
memset(c,0,sizeof(c));
char temp[510];
if(strlen(str1)<strlen(str2))
{
strcpy(temp,str1);
strcpy(str1,str2);
strcpy(str2,temp);
}
int m=strlen(str1);
int n=strlen(str2);
int i,j;
for(i=0;i<m;++i) a[m-i-1]=str1[i]-48;
for(j=0;j<n;++j) b[n-j-1]=str2[j]-48;
for(i=0;i<n;++i)
for(j=0;j<m;++j)
c[i+j]=b[i]*a[j]+c[i+j];
int max=2*m;
for(i=0;i<max;++i)
{
c[i+1]=c[i]/10+c[i+1];
c[i]=c[i]%10;
}
while(c[max]==0)
{
max--;
}
if(max<0) cout<<0<<endl;
else
for(max;max>=0;--max)
cout<<c[max];
cout<<endl;
}
4.除法
#include<iostream>
#include<cstring>
using namespace std;
int len1,len2;
char s1[905];
char s2[905];
int re[905];
void sub()
{
int i=0;
int j;
while(1)
{
if(s1[i]=='0')
i++;
else
{
j=i;
break;
}
}
for(;i<len2;i++)
{
s1[i]=s1[i]-s2[i]+'0';
}
for(i=len2-1;i>j;i--)
{
if(s1[i]<'0')
{
s1[i]+=10;
s1[i-1]--;
}
}
}
int main()
{
int i,p;
while(cin>>s1>>s2)
{
len1=strlen(s1);
len2=strlen(s2);
if(len1<len2||len1==len2&&strncmp(s1,s2,len2)<0)
{
cout<<0<<endl;
continue;
}
p=0;
while(1)
{
re[p]=0;
while(strncmp(s1,s2,len2)>=0)
{
sub();
re[p]++;
}
p++;
if(len1==len2) break;
for(i=len2-1;i>=0;i--)
{
s2[i+1]=s2[i];
}
s2[0]='0';
len2++;
s2[len2]='\0';
}
i=0;
while(1)
{
if(re[i]==0)
i++;
else
break;
}
for(;i<p;i++)
cout<<re[i];
cout<<endl;
}
return 0;
}