轉自:http://blog.csdn.net/archimedes_zht/article/details/2141881
在ACM的題目中經常會遇到大數相加和相乘的問題,在有些公司的面試題中也有暗含要用大數才能解決的問題。比如:輸入三個整數,寫一個程序判斷這個三個整數能否構成一個直角三角形。此題算法很簡單,但是卻暗含着結果可能溢出的問題。如果不會用大數,此題就無法給出完美的答案。
下面給出大數的乘法和加法算法:
1、加法:
char* add(char *a, char *b, int m, int n)
{
// 爲結果分配內存空間。
char *c = (char*)malloc((m + 2)* sizeof(char));
memset(c, 0, (m + 2) * sizeof(char));
// 將字符(0 + 0x30 到 9 + 0x30)轉換爲數字(0到9)進行計算。
for (int i = m, j = n - 1; j >= 0; --i, --j)
c[i] += (b[j] - 0x30);
for (int i = m, j = m - 1; j >= 0; --i, --j)
{
c[i] += (a[j] - 0x30);
if (c[i] > 9)
{
c[i - 1] += 1;
c[i] -= 10;
}
}
// 將由純數字組成的結果轉換爲字符串,並去除首部可能還存在的零。
for (int i = 0; i != m + 1; ++i)
c[i] += 0x30;
if (c[0] == 0x30)
for (int i = 0; c[i] != '/0'; ++i)
c[i] = c[i + 1];
// 返回結果所在內存單元的首地址。
return c;
}
2、乘法:
char* mult(char *a, char *b, int m, int n)
{
// 爲結果分配內存空間。
char *c = (char*)malloc((m + n + 1) * sizeof(char));
memset(c, 0, (m + n + 1) * sizeof(char));
// 將字符(0 + 0x30 到 9 + 0x30)轉換爲數字(0到9)進行計算。
for (int i = m - 1, r = m + n - 1; i >= 0; --i, --r)
{
for (int j = n - 1, k = r; j >= 0; --j, --k)
{
c[k] += (a[i] - 0x30) * (b[j] - 0x30);
int tmp = c[k] / 10;
if (tmp > 1)
{
c[k - 1] += tmp;
c[k] -= tmp * 10;
}
}
}
// 將由純數字組成的結果轉換爲字符串,並去除首部可能還存在的零。
c[m + n] = '/0';
for (int i = 0; i != m + n; ++i)
c[i] += 0x30;
for (int i = 0; c[i] != '/0'; ++i)
c[i] = c[i + 1];
// 返回結果所在內存單元的首地址。
return c;
}