您的位置:首页 > 其它

大数的四则运算

2016-09-28 21:42 176 查看
在处理大数的运算时,一般采用数组去模拟,下面介绍大数的加、减、乘、除四则运算的实现方法。
1.加法。
  如:
  Input: 123456789123456789123456789
            1
  Output:123456789123456789123456790
  输入采用字符数组保存,然后将输入存在整形数组里,然后逐位相加即可,同时注意进位处理。

#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}

int main(void)
{

char str1[510],str2[510];
while(scanf("%s %s",str1,str2)==2)
{

int a[510]={0<
4000
/span>},b[510]={0},c[510]={0},i;
int m,n,max1=0;
m=strlen(str1);
n=strlen(str2);
max1=max(m,n);
for(i=0;i<max1;i++)
{
a[m-i-1]=str1[i]-48;
b[n-i-1]=str2[i]-48;
}
for(i=0;i<max1;i++)
c[i]=a[i]+b[i];
for(i=0;i<max1;i++)
{
c[i+1]=c[i]/10+c[i+1];
c[i]=c[i]%10;
}
if(c[max1]!=0)
{
for(i=max1;i>=0;i--)
printf("%d",c[i]);
}
else
{
for(i=max1-1;i>=0;i--)
printf("%d",c[i]);
}
printf("\n");
}
return0;
}


2.减法
Input:123456789123456789
         1
Output:123456789123456788
原理同加法一样(这里假设第一个数大于第二个数)

#include<stdio.h>

#include<string.h>

int main(void)
{
char s1[505],s2[505];
while(scanf("%s%s",s1,s2)==2)
{
int i,j,len1,len2;
int a[105]={0},b[105]={0};
len1=strlen(s1);
len2=strlen(s2);
for(i=len1-1,j=0;i>=0;i--,j++)
{
a[j]=s1[i]-48;
}
for(i=len2-1,j=0;i>=0;i--,j++)
{
b[j]=s2[i]-48;
}
for(i=0;i<len1;i++)
{
a[i]=a[i]-b[i];
if(a[i]<0)
{
a[i]+=10;
a[i+1]--;
}
}
i=len1-1;
while(a[i]==0)
{
i--;
}
for(;i>=0;i--)
{
printf("%d",a[i]);
}
printf("\n");
}
return0;
}


 3.乘法
  原理上也是采用数组模拟。
 a[i]   12345
 b[j]        23
 用c[k]来保存每次的运算结果,k=i+j;
 c[i+j]=c[i+j]+a[i]*b[j];
 这里来模拟一次乘法过程:
            123
         *   12
      --------------
             246   
        + 123
      --------------
            1476

#include<iostream>
#include<string.h>
usingnamespace std;

int main(void)
{
char s1[510],s2[510],temp[510];
int a[510],b[510],c[1010];
while(scanf("%s%s",s1,s2)==2)
{
int i,j,h;
int len1,len2;
if(strlen(s1)<strlen(s2))
{
strcpy(temp,s1);
strcpy(s1,s2);
strcpy(s2,temp);
}
len1=strlen(s1);
len2=strlen(s2);
memset(c,0,sizeof(c));
for(i=len1-1,j=0;i>=0;i--,j++)
{
a[j]=s1[i]-48;
}
for(i=len2-1,j=0;i>=0;i--,j++)
{
b[j]=s2[i]-48;
}
for(i=0;i<len2;i++)
{
for(j=0;j<len1;j++)
{
c[i+j]=a[j]*b[i]+c[i+j];
}
}
for(i=0;i<2*len1;i++)
{
if(c[i]>=10)
{
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
}
i=2*len1;
while(c[i]==0)
{
i--;
}
if(i<0)
{
printf("0\n");
}
else
{
for(;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
}
return0;
}


4.除法
除法也是利用数组模拟,不过这里不是直接按照除法的运算来,而是把除法转变为减法运算,从而求得结果。

#include<stdio.h>
#include<string.h>

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--)    //低位开始检测是否小于0
{
if(s1[i]<'0')
{
s1[i]+=10;
s1[i-1]--;
}
}
}

int main(void)
{
int i,p;
while(scanf("%s%s",s1,s2)==2)
{
len1=strlen(s1);
len2=strlen(s2);
if(len1<len2||(len1==len2&&strncmp(s1,s2,len2)<0))   //如果a<b,直接输出0
{
printf("0\n");
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前面补0,以便进行减法运算
{
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++)
printf("%d",re[i]);
printf("\n");
}
return0;
}


作者:海子
    
出处:http://www.cnblogs.com/dolphin0520/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: