大数运算(3)——大数减法
大數的減法與大數加法的方法有相似之處的,都是模擬人工運算的,從最低位開始運算,一直到最高位。
其方法是:
首先,要判斷減數和被減數哪一個位數長,減數位數長是正常減;被減數位數長,則被減數減減數,最后還要加上負號;兩數位數長度相等時,最好比較一下哪一個數字大,否則負號處理會很繁瑣,用大的減去小的,最后加上負號;
其次,處理每一項時要,如果前一位相減有借位,就先減去上一位的借位,無則不減;再去判斷是否能夠減開被減數,如果減不開,就要借位后再去減,同時置借位為1,否則置借位為0。
結果可能會出現前面是一堆0的情況,要處理好,如當減數為112,而被減數為111時,會出現001 ,這時,需要將前面的0刪除。
例如:13154-21213(同樣,從最低位開始相減)
? ?3 ?2 ?1 ?2 ?2
- 4 ?5 ?1 ?3 ?1
————————
? 9 ? ?//向前一位借1,則前一位的2變為1
? ? ? 6 ? ?// 2---->1向前一位借1,則前一位的1變為0
? ? ? ? ? 9 ? ?//1---->0向前一位借1,則前一位的2變為1
? ? ? ? ? ? ? 8 ? ? ?//2---->1向前一位借1,則前一位的2變為1
? ? ? ? ? ? ? ? ? ?0 ? ?//不用借位。
? 9 ?6 ?9 ?8 ?0 ? ? ?//當然,輸出時將0刪除,并加上負號,即-9896
下面是C語言代碼實現:
#include<stdio.h> #include<string.h> int x[100]={0},y[100]={0},z[105]={0};//將數組元素全部初始化為0 void sub(int x[],int y[],int len) { int i,j; for(i=0;i<len;i++) { if(x[i]>=y[i])//如果x[i]>=y[i],不用向前一位借1,可直接減 z[i]=x[i]-y[i]; else //如果x[i]<y[i],向前一位借1,同時前一位應減1 { z[i]=x[i]+10-y[i]; x[i+1]=x[i+1]-1; } } for(i=len-1;i>0;i--)//刪除前綴0 { if(z[i]==0) len--; else break; } for(i=len-1;i>=0;i--) //倒序輸出數組 printf("%d",z[i]); printf("\n"); } int main() { char a[100],b[100];//通過字符串對大數進行輸入并儲存 int len1,len2; while(scanf("%s %s",a,b)) { int i,j=0,k=0; len1=strlen(a); len2=strlen(b); for(i=len1-1,j=0;i>=0;i--)//將兩個字符串中的字符轉化為數字,并倒序儲存到數組中,即字符串為123456,則數組為654321 x[j++]=a[i]-'0'; for(i=len2-1,k=0;i>=0;i--) y[k++]=b[i]-'0'; if(len1>len2) //若減數長度 > 被減數,正常減 sub(x,y,len1); else if(len1<len2) //若減數長度 < 被減數,被減數 減 減數 { printf("-"); sub(y,x,len2); } else //若減數長度 == 被減數,判斷兩個數的大小 { for(i=len1-1;i>=0;i--)//判斷每一位兩個數的大小 { if(x[i]==y[i]) continue; if(x[i]>y[i])//即減數大 { sub(x,y,len1); break; } if(x[i]<y[i])//即被減數大 { printf("-"); sub(y,x,len1); break; } } } } return 0; }總結
以上是生活随笔為你收集整理的大数运算(3)——大数减法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数运算(2)——大数加法
- 下一篇: 互联网晚报 | 4月12日 星期二 |