大數加減法法思想
阿新 • • 發佈:2019-01-24
當運算的倆個數超過了int、float、double的時候,該如何運算呢?
簡單例題:兩個正整數,無限大,輸出兩個數相加的結果。
思想:表示無限大的數,只有使用字串來表示了,所以使用字串來模擬計算過程是大數處理的過程。
#include <iostream> #include<stdlib.h> #include<string.h> using namespace std; char* add(char *a,char *b) { int la=strlen(a); int lb=strlen(b); int lc=0; int flag=0;//進位標誌 if(la>lb)//計算輸出字串的最大長度(進位的話多一位) { lc=la+1; } else{ lc=lb+1; } char *c=(char *)malloc(lc+1);//+1是因為字串末位要有'\0'佔一位’ c[lc+1]='\0'; la--;lb--;lc--;//la lb lc變為計數器 //加法計算方法為從末位依次向前加 while (la>=0&&lb>=0) { c[lc]=(a[la]-'0'+b[lb]-'0'+flag)%10+'0';//ascii值與'0'相減 flag=(a[la]-'0'+b[lb]-'0'+flag)/10;//是否進位+1 la--;lb--;lc--; } while (la>=0) { c[lc]=(a[la]-'0'+flag)%10+'0'; flag=(a[la]-'0'+flag)/10; la--;lc--; } while (lb>=0) { c[lc]=(b[lb]-'0'+flag)%10+'0'; flag=(b[lb]-'0'+flag)/10; lb--;lc--; } //當a、b都加完畢 還進位的話就是首位就是1否則就是0 c[0]='0'+flag; if(c[0]=='0'){ return c+1; }else{ return c; } } int main(void) { char a[50]; char b[50]; gets(a); gets(b); char *c=add(a,b); cout<<c<<endl; return 0; }
這只是簡單應用,但表明了大數處理的思想,更多的考慮還有 僅僅是整數呢?僅僅是實數呢?相減呢?
但本質上都是利用字串、ascii碼來處理的。