大數問題:用字符串解決大數相加和相乘

轉自:http://blog.csdn.net/archimedes_zht/article/details/2141881


在ACM的題目中經常會遇到大數相加和相乘的問題,在有些公司的面試題中也有暗含要用大數才能解決的問題。比如:輸入三個整數,寫一個程序判斷這個三個整數能否構成一個直角三角形。此題算法很簡單,但是卻暗含着結果可能溢出的問題。如果不會用大數,此題就無法給出完美的答案。

下面給出大數的乘法和加法算法:

1、加法:

// assume m is bigger than n.
char* add(char *a, char *b, int m, int n)
{
    
// 爲結果分配內存空間。
    char *= (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;
        }
    }
    
// 將由純數字組成的結果轉換爲字符串,並去除首部可能還存在的零。
   c[m + 1] = '/0';
    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、乘法:

// assume m is bigger than n.
char* mult(char *a, char *b, int m, int n)
{
    
// 爲結果分配內存空間。
    char *= (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;
    if (c[0== 0x30)
        
for (int i = 0;  c[i] != '/0'; ++i)
            c[i] 
= c[i + 1];

    
// 返回結果所在內存單元的首地址。
    return c;
}

發佈了26 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章