Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244812
  • 博文数量: 62
  • 博客积分: 973
  • 博客等级: 准尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-16 23:25
文章分类

全部博文(62)

文章存档

2013年(1)

2012年(14)

2011年(47)

分类: C/C++

2011-12-22 17:06:50

1、加法
//blog.csdn.net/simplestbest/article/details/6788298
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include

  4. #define MAXSIZE 1000

  5. void bigadd(const char *a, const char *b, char *pret)
  6. {
  7.     int ia = strlen(a)-1; //a的个位索引
  8.     int ib = strlen(b)-1; //b的个位索引
  9.     int carry = 0; //进位
  10.     int sum = 0; // 每位的和
  11.     int ret_len = ia > ib ? (ia+1) : (ib+1);
  12.     // malloc时考虑进位和'\0'
  13.     char *result = (char *)malloc( (ret_len + 2) * sizeof(char) );
  14.     if( !result ) /* perror(); */ exit(-1);
  15.     ret_len = 0;
  16.      
  17.     while( ia >= 0 || ib >= 0)
  18.     {
  19.         sum = carry;
  20.         if(ia >= 0)
  21.         {
  22.             sum += a[ia--] - '0';
  23.         }
  24.         if(ib >= 0)
  25.         {
  26.             sum += b[ib--] - '0';
  27.         }
  28.         carry = sum/10;
  29.         sum = sum%10;
  30.         result[ret_len++] = sum + '0';
  31.     }
  32.     if(carry > 0)
  33.         result[ret_len++] = carry + '0';
  34.     //result[ret_len] = '\0'; Not useful.
  35.     while(ret_len > 0)
  36.     {
  37.         *pret++ = result[--ret_len];
  38.     }
  39.     *pret = '\0';

  40.     free(result);
  41. }

  42. int main(int argc, char *argv[])
  43. {
  44.     if (argc != 3)
  45.     {
  46.         printf("Usage: %s a b\n", argv[0]);
  47.         return -1;
  48.     }
  49.     
  50.     char result[MAXSIZE] = {0};
  51.     bigadd(argv[1], argv[2], result);
  52.     printf(" %s\n + %s\n", argv[1], argv[2]);
  53.     printf("--------------------------------\n %s", result);
  54.     return 0;
  55. }
3、乘法
  未测,写的有点乱。
  1. void bigMultiple(char *a, char *b, char *pret)
  2. {
  3.     int xArr[MAXSIZE], yArr[MAXSIZE], result[MAXSIZE*2];
  4.     int len_a = strlen(a);
  5.     int len_b = strlen(b);
  6.     int i,j;
  7.     
  8.     for(i = 0; i < MAXSIZE; ++i)
  9.     {
  10.         xArr[i] = 0;
  11.         yArr[i] = 0;
  12.     }
  13.     for(i = 0; i < MAXSIZE*2; ++i)
  14.     {
  15.         result[i] = 0;
  16.     }
  17.     
  18.     // atoi and reversed into Arr
  19.     for(i = 0; i < len_a; ++i)
  20.     {
  21.         //a[0]是高位,作为xArr的最后一个数
  22.         xArr[len_a - 1 - i] = a[i] - '0';
  23.     }
  24.     for(j = 0; j < len_b; ++j)
  25.     {
  26.         yArr[len_b - 1 - j] = b[j] - '0';
  27.     }
  28.     
  29.     // calculate
  30.     for(i = 0; i < len_a; ++i)
  31.     {
  32.         for(j = 0; j < len_b; ++j)
  33.         {
  34.             result[i+j] += a[i]*b[j];
  35.         }
  36.     }
  37.     for(i = 0; i < (len_a + len_b + 1); ++i)
  38.     {
  39.         if(result[i] > 0)
  40.         {
  41.             result[i+1] += result[i]/10; //进位
  42.             result[i] = result[i]%10;
  43.         }
  44.     }
  45.     // return to pret, use prev i.
  46.     for(; i >= 0 ; --i)
  47.     {
  48.         if(result[i] != 0)
  49.             break;
  50.     }
  51.     
  52.     for(j = 0; j < i; ++j)
  53.         *(pre+j) = result[i-j];
  54.     *(pre+j) = '\0';
  55. }
2、减法
 
.
阅读(1746) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~