高精度減法——一步一步演算法篇
阿新 • • 發佈:2019-02-15
高精度減法
利用豎式計算的方式,注意借位和錯位,還有前導0。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
int a[256],b[256],c[256],lena,lenb,lenc,i;
char n[256],n1[256],n2[256];
memset(a,0,sizeof(a));
memset(b,0 ,sizeof(b));
memset(c,0,sizeof(c));
gets(n1); //輸入被減數
gets(n2); //輸入減數
if (strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0))
{ //strcmp()為字串比較函式,如果n1==n2,返回0
//如果n1>n2,返回正整數,如果n1<n2,返回負整數
strcpy(n,n1); //判斷被減數和減數的大小,交換減數和被減數
strcpy(n1,n2);
strcpy(n2,n);
cout<<"-"; //交換之後的資料,結果為負數
}
lena=strlen(n1);lenb=strlen(n2);
for (i=0;i<=lena-1;i++) a[lena-i]=n1[i]-'0'; //被減數放入a陣列
for (i=0;i<=lenb-1;i++) b[lenb-i]=n2[i]-'0'; //減數放入b陣列
i=1;
while (i<=lena)
{
if (a[i]<b[i])
{
a[i]+=10; //不夠減借位
a[i+1]--; //上一位減一
}
c[i]=a[i]-b[i]; //對應位相減
i++;
}
lenc=i;
for (i=lenc;i>=1;i--)
if ((c[i]==0)&&(lenc>1)) lenc--;else break; //刪除前導“0”
for (i=lenc;i>=1;i--) cout<<c[i];
cout<<endl;
return 0;
}
一步一步演算法篇