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

全部博文(113)

文章存档

2014年(1)

2013年(2)

2012年(94)

2011年(16)

分类: LINUX

2012-03-05 19:39:23

  1. /*

  2. 高精度乘法
  3. 输入:两行,每行表示一个非负整数(不超过10000位)
  4. 输出:两数的乘积。
  5. */

  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <memory.h>

  10. #define MAX 10001

  11. int high_precision(int *sum,int *a,int *b,int a_len,int b_len)
  12. {
  13.     int i,j;
  14.     memset(sum,0,sizeof(sum));
  15.     int sum_len = 0 ;
  16.     for(i=1;i<=a_len;i++) /*用数组模拟运算*/
  17.         for(j=1,sum_len=i-1;j<=b_len;j++)
  18.             sum[++sum_len] += b[j]*a[i];
  19.     for(i=1;i<=sum_len;i++)/*进位处理*/
  20.         if(sum[i] >= 10)
  21.         {
  22.             if(sum[sum_len] >= 10)
  23.                 sum_len++;
  24.             sum[i+1] += sum[i]/10;
  25.             sum[i] %= 10;
  26.         }

  27.     return sum_len;
  28. }

  29. void multiply(char* a, char* b, char* c)
  30. {
  31.     int i, j, ca, cb, * s;
  32.     ca = strlen(a);
  33.     cb = strlen(b);
  34.     s = (int*)malloc(sizeof(int) * (ca + cb));
  35.     for (i = 0; i < ca + cb; i++)
  36.         s[i] = 0;
  37.     for (i = 0; i < ca; i++)
  38.         for (j = 0; j < cb; j++)
  39.             s[i+j+1] += (a[i] - '0') * (b[j] - '0');
  40.     for (i = ca + cb - 1; i >= 0; i--)
  41.         if (s[i] >= 10)
  42.         {
  43.             s[i-1] += s[i] / 10;
  44.             s[i] %= 10;
  45.         }
  46.     i = 0;
  47.     while (s[i] == 0)
  48.         i++;
  49.     for (j = 0; i < ca + cb; i++, j++)
  50.         c[j] = s[i] + '0';
  51.     c[j] = '\0';
  52.     free(s);
  53. }

  54. int main(int argc,char *argv[])
  55. {
  56.     int a[MAX]= {0},b[MAX]= {0},sum[MAX*2]= {0};
  57.     int a_len=0,b_len=0,sum_len=0;
  58.     int i,j;
  59.     char c_a[MAX],c_b[MAX],c_sum[MAX*2];

  60.     scanf("%s%s",c_a,c_b);

  61.     a_len = strlen(c_a);
  62.     b_len = strlen(c_b);

  63.     for(i=1,j=a_len-1;i<= a_len;i++,j--)
  64.         a[i] = c_a[j] - '0';
  65.     for(i=1,j=b_len-1;i<= b_len;i++,j--)
  66.         b[i] = c_b[j] - '0';

  67.     sum_len = high_precision(sum,a,b,a_len,b_len) ;

  68.     for(i=sum_len;i>=1;i--)
  69.         printf("%d",sum[i]);
  70.     putchar('\n');
  71.     multiply(c_a,c_b,c_sum);
  72.     printf("%s\n",c_sum);

  73.     return 0 ;
  74. }
阅读(7628) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~