微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大数问题:用字符串解决大数相加和相乘

 

大数问题:用字符串解决大数相加和相乘。

分类: 数据结构和算法   4349人阅读  评论(5)  收藏  举报

在ACM的题目中经常会遇到大数相加和相乘的问题,在有些公司的面试题中也有暗含要用大数才能解决的问题。比如:输入三个整数,写一个程序判断这个三个整数能否构成一个直角三角形。此题算法很简单,但是却暗含着结果可能溢出的问题。如果不会用大数,此题就无法给出完美的答案。

下面给出大数的乘法和加法算法:

1、加法:

//  assume m is bigger than n.
char *  add(   a,  b,255)">int  m,0)"> n)
{
    
 为结果分配内存空间。      =  ( )malloc((m  + 2 ) sizeof ( ));
    memset(c,0)">0
, (m  ));
    
 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。 for  i   n  - 1 ; j  >= -- i,0)">j)
        c[i] 
+=  (b[j]  0x30 );
    
 m  j)
    {
        c[i] 
 (a[j]  );
        
if  (c[i]  > 9 )
        {
            c[i 
;
            c[i] 
-= 10 ;
        }
    }
    
 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。
   c[m + 1] = '/0'; ; i  != ++ i)
        c[i] 
;
    
 (c[ == )
        
; c[i] != '/0';  i)
            c[i] 
 c[i  ];
    
 返回结果所在内存单元的首地址。 return  c;
}

2、乘法:

 mult( ));

    
r)
    {
        
 j   r; j  j,0)">k)
        {
            c[k] 
 (a[i]  );
            
 tmp   c[k]  / ;
            
 (tmp  )
            {
                c[k 
 tmp;
                c[k] 
;
            }
        }
    }

    
 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。     c[m + n] = '/0';
    
 n;  ;
;  c[i] != '/0';  ];

    
 c;
}

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <assert.h>  
  5.   
  6. // assume m is bigger than n.  
  7. char* mult(char *a, char *b,87); background-color:inherit; font-weight:bold">int m,87); background-color:inherit; font-weight:bold">int n) {  
  8.     int g = m + n;  
  9.     // 为结果分配内存空间。  
  10. char *c = (char*)malloc(g * sizeof(char));  
  11.     memset(c, 0, g * char));  
  12.   
  13.     c[g - 1] = '\0';  
  14.     // 将字符(0 + 0x30 到 9 + 0x30)转换为数字(0到9)进行计算。  
  15.     for (int i = m - 1, r = g - 2; i >= 0; --i, --r) {  
  16.         int j = n - 1, k = r; j >= 0; --j, --k) {  
  17.             c[k] += (a[i] - 0x30) * (b[j] - 0x30);  
  18.             int tmp = c[k] / 10;  
  19.             if (tmp >= 1) {  
  20.                 assert(k - 1 >= 0);  
  21.                 c[k - 1] += tmp;  
  22.                 c[k] -= tmp * 10;  
  23.             }  
  24.         }  
  25.     }  
  26. // 将由纯数字组成的结果转换为字符串,并去除首部可能还存在的零。  
  27.     int i = 0; i != g - 1; ++i)  
  28.         c[i] += 0x30;  
  29. if (c[0] == 0x30)  
  30.         int i = 0; c[i] != '\0'; ++i)  
  31.             c[i] = c[i + 1];  
  32. // 返回结果所在内存单元的首地址。  
  33. return c;  
  34. }  
  35. void test(char* a,87); background-color:inherit; font-weight:bold">char* b) {  
  36. int i = 0; a[i] != '\0'; ++i) {  
  37. if (a[i] != b[i]) {  
  38.             printf("%d %c %c\n", i, a[i], b[i]);  
  39.         assert(a[i] == b[i]);  
  40.     }  
  41. }  
  42. int main() {  
  43. char a[1024] = "123";  
  44.     char b[1024] = "1";  
  45.     printf("123 * 1\n");  
  46. char* c = mult(a, b, 3, 1);  
  47.     test(c, "123");  
  48.     free(c);  
  49.     strcpy(b, "12");  
  50.     printf("123 * 12\n");  
  51.     c = mult(a, 2);  
  52. "1476");  
  53. "123");  
  54.     printf("123 * 123\n");  
  55. "15129");  
  56.     strcpy(a, "123456789123456789");  
  57.     strcpy(b, "123456789123456789");  
  58.     printf("123456789123456789 * 123456789123456789\n");  
  59.     c = mult(a, 18, 18);  
  60.     test(c, "15241578780673678515622620750190521");  
  61.     free(c);  
  62.     strcpy(a, "12345678912345678");  
  63.     printf("123456789123456789 * 12345678912345678\n");  
  64. "1524157878067367740451151863907942");  
  65. "1234567891234567");  
  66.     printf("123456789123456789 * 1234567891234567\n");  
  67. "152415787806736675279683887625363");  
  68. return 0;  
  69. }  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐