eg:計算10002-99的差 ① ...
在C語言中,int類型最多只能表達的數據為【-2^31,2^31-1】,double類型雖然可以表達到300多位十進位數,但其精度損失很大,不能用於高精度計算,即使是long或者 __int64類型也只能表達【-2^63,2^63-1】的數據,所以高精度的大數減法計算需要通過數組模擬減法的過程。
①:比較兩個數的大小(非負數),通過長度判斷大小,若長度相等,使用strcmp比較,把結果(-1、0、1)存入res,相等直接跳出。
②:a數組和b數組逆序。
③:從較小的數(b數組)開始相減。
④:接下來在a數組考慮借位的情況。
⑤:將前導0除去。
⑥:若結果為負數,加上負號。
⑦:在數組最後以 ‘\0’ 結尾。
⑥:逆序回正常。
#include "stdio.h" #include "string.h" #include "algorithm" #define N 3005 using namespace std; int cmp(char a[],char b[]) //比較兩個數大小 { //如果 a>b返回1,a=b返回0,a<b返回-1 int lena=strlen(a); int lenb=strlen(b); if(lena>lenb)return 1; if(lena==lenb)return strcmp(a,b); if(lena<lenb)return -1; } void sub(char a[],char b[],char c[]) { int t,i,r=0; int res=cmp(a,b); if(res<0) //如果第一個數小,需要交換 { strcpy(c,a); strcpy(a,b); strcpy(b,c); } else if(res==0) //如果相等直接跳出 { strcpy(c,"0"); return; } strrev(a); //逆序 strrev(b); //逆序 for(i=0;b[i]!='\0';i++) //低位至高位 { t=(a[i]-'0'-r)-(b[i]-'0'); //每位上的相減 if(t<0) { r=1; //向高位借1 t=t+10; } else r=0; //不借位 c[i]=t+'0'; //結果轉換為字元 } for(;a[i]!='\0';i++) //a中剩下的還需考慮借位 { t=a[i]-'0'-r; if(t<0) { r=1; t=t+10; } else r=0; c[i]=t+'0'; } while(c[i-1]=='0') //去除前導0 i--; if(res<0) //若結果為負 c[i++]='-'; c[i]='\0'; //結尾 strrev(c); //逆序回正常 } int main() { char a[N],b[N],c[N]; scanf("%s %s",a,b); sub(a,b,c); puts(c); return 0; }