C/C++高精度算法的实现分享!

被乘数4296556241
乘数56241
被乘数x乘数4296556241
14296556241
4168*1038620*1024964*10
284*10019310*10012482*100
6252*100057930*100037446*1000
5210*1000048275*1000031205*10000
累加和2362122543006855351000081
进位(从低位向高位)2415430435100
241642619550081

C语言实现代码如下:

  #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #define N 200    //整数乘幂运算函数  int Pow(int a, int b)  {    int i = 0, result = 1;    for(i = 0; i < b; ++i)    {      result *= a;    }    return result;  }      //High Precision Of Multiplication  int main()  {    char stra[N], strb[N];   //字符串数组,以字符形式储存两个大数;    int i = 0, j = 0, k = 0, step = 4, carry = 0; //step表示块长,carry为进位位;    int lengtha, lengthb, resultsize, tmpsize, eachnum; //resultsize储存块的总数,eachnum用来储存乘数的每一位    int numa[N], numb[N], numc[N], tmp[N];  //依次储存被乘数数&积,乘数;    memset(numa, 0, sizeof(numa));    memset(numb, 0, sizeof(numb));    memset(numc, 0, sizeof(numc)); //初始化为零;    scanf("%s%s", stra, strb);    lengtha = strlen(stra);    lengthb = strlen(strb);   //计算两个大数的长度    //将被乘数字符数字转为四位一块的整数数字    for(i = lengtha-1; i >= 0; --i)    {      numa[(lengtha-1-i)/step] += (stra[i]-'0')*Pow(10,(lengtha-1-i)%step);    }    //将乘数数字字符数字转为一位一块的整数数字    for(i = lengthb-1; i >= 0; --i)    {      numb[lengthb-1-i] = strb[i]-'0';    }      resultsize = tmpsize = (lengtha-1)/step;    //取乘数的每一位与被乘数的逐块相乘,并进位;    for(i = 0; i < lengthb; ++i)    {      memcpy(tmp, numa, sizeof(numa));  //将numa数组赋值给tmp数组;        k = i/step;   //k储存每一块需要向高位块移动的次数;      if(k)      {        for(j = tmpsize; j >= 0; --j)        {          tmp[j+k] = tmp[j];          tmp[j] = 0;        }        tmpsize += k;      }        //乘以乘数每一位扩展成的块;      eachnum = numb[i]*Pow(10, i%step);      for(j = 0; j <= tmpsize; ++j)      {        tmp[j] *= eachnum;      }        //大数相加      carry = 0; //进位置零;      for(j = 0; j <= resultsize; ++j)      {        numc[j] += tmp[j] + carry;        carry = numc[j]/Pow(10,step);        numc[j] %= Pow(10, step);      }      if(carry)      {        ++resultsize;        numc[j] += carry;      }    }      //输出    printf("%d", numc[resultsize]);    for(i = resultsize-1; i >= 0; --i)    {      printf("%04d", numc[i]);  //右对齐,补零输出;    }    printf("n");    return 0;  }    

4. 高精度除法

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/483681.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐