Chinaunix首页 | 论坛 | 博客
  • 博客访问: 614544
  • 博文数量: 113
  • 博客积分: 2554
  • 博客等级: 少校
  • 技术积分: 1428
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-21 19:53
文章分类

全部博文(113)

文章存档

2014年(1)

2013年(2)

2012年(94)

2011年(16)

分类: LINUX

2012-03-06 14:29:53

  1. /*******************************************************************************
  2.  **
  3.  ** Copyright (c) 20010-2012 UESTC.
  4.  ** All rights reserved.
  5.  **
  6.  ** File name: big_int_add.c
  7.  ** Description:
  8.  **
  9.  ** Current Version: 0.0
  10.  ** Revision: 0.0.0.0
  11.  ** Author: panhong
  12.  ** Date: 2012-03-06
  13.  ** Email:wospanhong@tom.com
  14.  ******************************************************************************/
  15. #include<stdio.h>
  16. #include<string.h>
  17. #include<assert.h>
  18. #define MAX(a, b) (((a) < (b)) ? (b) : (a))
  19. #define MAXBIT 100

  20. int pos[MAXBIT];

  21. char* str_reverse(char *s)
  22. {
  23.     char* p = s;
  24.     size_t len = strlen(p);
  25.     char tmp;
  26.     size_t i;
  27.     for(i = 0; i < len / 2; ++i)
  28.     {
  29.         tmp = *(p + i);
  30.        *(p + i) = *(p + len -1- i);
  31.        *(p + len -1 - i) = tmp;
  32.     }
  33.     return s;
  34. }

  35. char* big_int_add(const char *lhs, const char *rhs, char *result_buf, size_t buf_size)
  36. {
  37.    assert(lhs != NULL && rhs != NULL);

  38.     size_t llen = strlen(lhs);
  39.     size_t rlen = strlen(rhs);

  40.     if(MAX(llen, rlen) + 1 > buf_size || MAX(llen, rlen) > MAXBIT)
  41.         return NULL;

  42.     if(llen < rlen)
  43.     {
  44.         const char *p = lhs;
  45.         lhs = rhs;
  46.         rhs = p;
  47.         llen ^= rlen;
  48.         rlen ^= llen;
  49.         llen ^= rlen;
  50.     }

  51.     memset(pos, 0, sizeof(pos));
  52.     memset(result_buf, 0, buf_size);

  53.     int bit_sum = 0;
  54.     size_t i = 0;
  55.     lhs += llen;
  56.     rhs += rlen;
  57.     for(; i < rlen; ++i)
  58.     {
  59.         bit_sum = (*(--lhs) - '0') + (*(--rhs) - '0') + pos[i];
  60.        *(result_buf + i) = (char)((bit_sum) % 10 + '0');
  61.        if(bit_sum > 9)
  62.            pos[i + 1] = 1;//进位
  63.     }

  64.     for(; i < llen; ++i)
  65.     {
  66.         bit_sum = *(--lhs) - '0' + pos[i];
  67.        *(result_buf + i) = (char)((bit_sum % 10) + '0');
  68.        if(bit_sum > 9)
  69.            pos[i + 1] = 1;
  70.     }

  71.     if(pos[i] == 1)
  72.         *(result_buf + i) = (char)(pos[i] + '0');

  73.     return str_reverse(result_buf);
  74. }

  75. int main()
  76. {
  77.     char n1[100];
  78.     char n2[100];

  79.     scanf("%s", n1);
  80.     scanf("%s", n2);
  81.     char result[100];
  82.     printf("%s is the sum\n", big_int_add(n1, n2, result, 100));
  83.     return 0;
  84. }
阅读(642) | 评论(0) | 转发(0) |
0

上一篇:高精度乘法

下一篇:高精度运算合集

给主人留下些什么吧!~~