大数处理

大数的处理这里均采用模拟的方法。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值