• 高精度乘法


    (转)

    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] = '';
    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(' ');
    71.     multiply(c_a,c_b,c_sum);
    72.     printf("%s ",c_sum);
    73.     return 0 ;
    74. }
  • 相关阅读:
    ubuntu虚拟机下提示Network service discovery disabled
    jq简单实现选项卡--tab
    sublime text 出现错误error trying to parse file:Unexpected trailing characters in PackagesUserDefault(Windows).sublime-keymap:1:54
    sublime text 3设置快捷键让html文件在浏览器打开
    自动刷新浏览器
    项目---开饭了
    关于面试
    软件测试学习-关于三次握手与四次挥手的理解
    软件测试学习-笔记
    软件测试学习-数据库基础
  • 原文地址:https://www.cnblogs.com/yskyskyer123/p/4530110.html
Copyright © 2020-2023  润新知