您的位置:首页 > 运维架构

高精度运算专题2-减法运算(The subtraction operation)

2015-03-22 12:29 471 查看
这个专题呢,我就来讲讲高精度的减法,下面是三个计算减法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面

函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了。

①记录数组a、数组b、数组c的长度,放到第一位

②比较数组a和数组b的大小(长度长的大),如果大,交换也

③从前往后扫描数组a和数组b,每一位相减,如果数组a中的那一位<数组b中的那一位,就要借位(十位加十),再相减,存入数组c

注释:最后返回的ans是数组a与b的大小,-1则小,0则等,1则大

代码如下:

int sub(char strA[],char strB[],int c[])
//两个高精度的正整数a、b,计算a-b,结果放在c。
//c>0返回1;c==0返回0,c<0返回-1
{
char t[MaxLength];
int a[MaxLength]={0},b[MaxLength]={0};
int ans=1,i;
int lenA,lenB,lenC,temp;
memset(c,0,sizeof(c));
lenA=strlen(strA);
lenB=strlen(strB);
if(  lenA<lenB  ||  (  lenA==lenB  &&  strcmp(strA,strB)<0  )  )
{
strcpy(t,strA);
strcpy(strA,strB);
strcpy(strB,t);
ans=-1;
}
else if(strcmp(strA,strB)==0)
{
ans=0;
c[0]=1;
return ans;
}
init(strA,a);//从低位到高位存储
init(strB,b);//从低位到高位存储
i=1;
while(i<=a[0]||i<=b[0])
{
if(a[i]<b[i])//借位
{
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。
i++;
}
lenC=i;
while((c[lenC]==0)&&(lenC>1)) lenC--;//最高位的0不输出
c[0]=lenC;
return ans;
}


函数2思路:这个减法函数和函数1差不多的,只是省去了把字符串转换成数字的部分

代码如下:

int sub2(int a[],int b[],int c[])// 输入高精度正整数a和b,计算a-b,结果存储在c。  c>0返回1;c==0返回0,c<0返回-1
{
int ans,i,temp,len;
int lenC;
memset(c,0,sizeof(c));

ans=cmp(a,b);
if(ans==0)
{
c[0]=1;
c[1]=0;
return ans;
}
else if(ans == -1)
{//这里是表示a<b时要交换a和b
len=( a[0]>b[0] ? a[0] : b[0] );
for(i=0;i<=len;i++)
{
temp=a[i];a[i]=b[i];b[i]=temp;
}
}
//下面开始做减法操作
i=1;
while(i<=a[0]||i<=b[0])
{
if(a[i]<b[i])
{
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。
i++;
}
lenC=i;
while((c[lenC]==0)&&(lenC>1)) lenC--;//消除高位无意义的0
c[0]=lenC;
return ans;
}


函数3思路:这个函数优化了函数2,不用再开一个数组,大大地节省了时间

①首先得把数组a和数组b的长度分别存入a[0]、b[0]

②做减法,不够十要借位,十位数要加10,减去不够减的数

③最重要的一步:高位可能会有很多0,记得要消去

代码如下:

int sub3(int a[],int b[])//a=a-b 。   计算结果 a>0返回1;a==0返回0,a<0返回-1
{
int ans,i,temp,len;
int lenA;
ans=cmp(a,b);
if(ans==0)
{
a[0]=1;
a[1]=0;
return ans;
}
else if(ans==-1)
{
len=( a[0]>b[0] ? a[0] : b[0] );//这里是表示a<b时要交换a和b
for(i=0;i<=len;i++)//排序
{
temp=a[i];
a[i]=b[i];
b[i]=temp;
}
}
//下面开始做减法操作
i=1;
while(i<=a[0]||i<=b[0])
{
if(a[i]<b[i])//借位
{
a[i]+=10;
a[i+1]--;
}
a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。
i++;
}
lenA=i;
while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0
a[0]=lenA;
return ans;
}


函数4思路:这个函数优化了函数3,a=a-b,a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程

代码如下:

int sub4(int a[],int b[])//a=a-b 。a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程
{
int ans,i,temp,len;
int lenA;

ans=cmp(a,b);
if(ans==0)
{
a[0]=1;
a[1]=0;
return ans;
}
else if(ans==1)
{
//下面开始做减法操作
i=1;
while(i<=a[0])
{
if(a[i]<b[i])
{
a[i]+=10;
a[i+1]--;
}
a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。
i++;
}
lenA=i;
while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0
a[0]=lenA;
}
return ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: