大數問題
即因為要參加運算的數的位數很大,正常的加減乘除運算子精度不夠,解決不了的數的運算。
大數運算
就是以陣列的形式儲存每一位數,模擬正常加減乘除運算的過程。
大數加法
用兩個字元型陣列分別儲存要相加的兩個大數,因為加法運算是從兩個最低位開始依次相加,所以結果以倒序的方式儲存。例如(得到結果為225,則在陣列中儲存為522)
int sum[200],sx,k,l1,l2;
memset(sum,0,sizeof(sum));
sx = 0;
for(l1 = l1-1,l2 = l2-1; l1 >= 0 && l2 >= 0; l1--,l2--)//將長度相等的位數分別相加
sx++;
}//因為兩個相加的大數可能位數不相同,所以對沒有操作的數字單獨操作
while(l1 >= 0)
sx++;
l1--;
}while(l2 >= 0)
sx++;
l2--;
}//輸出結果,因為是倒敘儲存,所以輸出的時候也要倒敘輸出。
for(k = 199; sum[k] == 0; k--);
for(k; k >= 0; k--)
printf("%d",sum[k]);
printf("\n");
當然,為了避免對沒有參加運算的數字單獨處理,也可以在儲存兩個大數的時候就採用倒敘的方式。
不過需要注意的是,在倒敘儲存的時候,如果不是單個字元單個字元地賦值,那麼在字串的結尾會有乙個『\0』,
這個地方需要單獨處理一下。
for(i = 0,j = 0;i < l1 || j < l2;i++,j++)
sx++;
}大數減法
這裡只討論兩個數相減結果為正數的情況。同加法相似,加法也是從低位到高位依次相減,加法中相加結果大於9的要進製,
減法中,小於0的要
借位,這是需要特殊處理的地方。
for(l1--,l2--;l1 >= 0 && l2 >= 0;l1--,l2--)
sum[sx++] = (sz1[l1] - '0') - (sz2[l2] - '0');
}//沒有參與運算的數字直接落下
while(l1 >= 0)
大數乘法
在普通乘法運算時,我們是拿乙個數的每一位分別乘以另乙個數的所有位,然後相加。大數乘法也是模擬了這樣乙個過程。
for(i = l1-1;i >= 0;i--)
k++;
}}
大數加法 減法 乘法 除法
大數加法 實現 include include typedef char str 1000 void printnum int sum int len 輸出 void add str a int len a str b int len b 計算a b 只能 while len a 1 if c 0 ...
大數運算 加法減法
第一篇博文有點小雞凍。在哈工程寒假集訓中第一次模擬中唯一一道對我有價值的題就是大數加法,隨後的幾次模擬中大數運算不斷,可見這是我們必須掌握的技能,本人智商較低,先講解下大數加法減法,乘除階乘或者結合其他知識的大數運算日後定會奉上。究竟為什麼要用大數加法呢。我們來看下資料 bool型為布林型,佔1個位...
大數加法,大數乘法
include include include typedef struct node pnode 函式宣告 int multiply char strmultipliera,char strmultiplierb,char strrst pnode initlist char strmultipl...