找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2707|回复: 0
打印 上一主题 下一主题
收起左侧

大数相乘算法

[复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-16 06:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      师姐前几天有个在线笔试,怕时间上来不及就找我给她帮下忙。做了几道题目,觉得应该是面试当中常常用到的,大数相乘就是其中一个题目,觉得应该是以后面试中经常会用到的,所以记了下来。
      我这里采取的方法是将大数保存在字符串中,然后将两个字符串逐位相乘,再进位和移位。应该还有效率更高的代码。
源代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define N 100

  5. /*
  6. *将在数组中保存的字符串转成数字存到int数组中
  7. */
  8. void getdigits(int *a,char *s)
  9. {
  10.      int i;
  11.      char digit;
  12.      int len = strlen(s);

  13.      //对数组初始化
  14.      for(i = 0; i < N; ++i)
  15.            *(a + i) = 0;
  16.      for(i = 0; i < len; ++i){
  17.            digit = *(s + i);
  18.            *(a + len - 1 - i) = digit - '0';//字符串s="12345",因此第一个字符应该存在int数组的最后一个位置
  19.      }
  20. }

  21. /*
  22. *将数组a与数组b逐位相乘以后存入数组c
  23. */
  24. void multiply(int *a,int *b,int *c)
  25. {
  26.      int i,j;

  27.      //数组初始化
  28.      for(i = 0; i < 2 * N; ++i)
  29.            *(c + i) = 0;
  30.          /*
  31.           *数组a中的每位逐位与数组b相乘,并把结果存入数组c
  32.           *比如,12345*12345,a中的5与12345逐位相乘
  33.           *对于数组c:*(c+i+j)在i=0,j=0,1,2,3,4时存的是5与各位相乘的结果
  34.           *而在i=1,j=0,1,2,3,4时不光会存4与各位相乘的结果,还会累加上上次相乘的结果.这一点是需要注意的!!!
  35.          */
  36.      for(i = 0; i < N; ++i)
  37.            for(j = 0; j < N; ++j)
  38.                  *(c + i + j) += *(a + i) * *(b + j);
  39.          /*
  40.           *这里是移位、进位
  41.          */
  42.      for(i = 0; i < 2 * N - 1; ++i)
  43.      {
  44.            *(c + i + 1) += *(c + i)/10;//将十位上的数向前进位,并加上原来这个位上的数
  45.            *(c + i) = *(c + i)%10;//将剩余的数存原来的位置上
  46.      }
  47. }

  48. int main()
  49. {
  50.     int a[N],b[N],c[2*N];
  51.     char s1[N],s2[N];
  52.     int j = 2*N-1;
  53.     int i;
  54.    
  55.     printf("input the first number:");
  56.     scanf("%s",s1);
  57.     printf("/ninput the second number:");
  58.     scanf("%s",s2);
  59.    
  60.     getdigits(a,s1);
  61.     getdigits(b,s2);
  62.    
  63.     multiply(a,b,c);
  64.    
  65.     while(c[j] == 0)
  66.                j--;
  67.     for(i = j;i >= 0; --i)
  68.            printf("%d",c[i]);
  69.     printf("/n");
  70.     return 0;
  71. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表