c语言 高精度加,乘法实现详解

在说高精度运算之前,我们先搞明白什么是高精度运算?

实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。这个时候,如果要得到正确的计算结果,显然不能依靠普通方法实现了。而要在普通运算原理的基础上,加以辅助算法来实现超大数据的计算。例如:求两个100位的数据的和,或者计算两个100位的数字乘积。这时就要用到高精度算法了。

一.高精度加法

  1. 数据的输入:因为数字很大,不能用整数来输入,所以只能用字符数组输入,然后转化.
  2. 数据的存储:因为后面的运算是从前向后进行,所以我们在转化的时候需要反向来转化.
  3. 数据的运算:进位和借位,这里就是代码的核心了,就是手动模拟人算的.
  4. 结果的输出:小数点的位置和处于多余的0:最后一步很简单,看代码就能懂.
#include
#include
#include
int main() {
  char str1[1000];
  char str2[1000];
  int a[1000],b[1000],i,len;
  scanf("%s",str1);
  scanf("%s",str2);
  memset(a,0,sizeof(a));//初始化 
  memset(b,0,sizeof(b));
  a[0]=strlen(str1);
  b[0]=strlen(str2);
  len=(a[0]>b[0]?a[0]:b[0]);//取位数高的
  for(i = 1;i <= a[0];i++)
  a[i]=str1[a[0]-i]-'0';//把每一位数都存到数组中 
  for(i = 1;i <= b[0];i++)
  b[i]=str2[b[0]-i]-'0';
  for(i = 1;i <=len;i++) {
    a[i] += b[i];
    a[i+1] += a[i]/10;
    a[i] %= 10;
  }
  len++;
  while((a[len] == 0) && (len > 1)) len--;
  for(i = len;i >= 1;i--) 
  printf("%d",a[i]);
  return 0;
}

二.高精度乘法
核心为其中的循环写法,可以自己取两个比较小的数字进行模拟,加深理解,其他和高精度加法相似.

#include
#include
#include
int main() {
  char str1[1000];
  char str2[1000];
  scanf("%s",str1);
  scanf("%s",str2);
  int a[500],b[500],c[1000],i,j,len;
  memset(a,0,sizeof(a));
  memset(b,0,sizeof(b));
  memset(c,0,sizeof(c));
  a[0]=strlen(str1);
  b[0]=strlen(str2);
  for(i = 1;i <= a[0];i++)
  a[i]=str1[a[0]-i]-'0';
  for(i = 1;i <= b[0];i++)
  b[i]=str2[b[0]-i]-'0';
  //注意循环写法 
  for(i = 1;i <= a[0];i++) {
    for(j = 1;j <= b[0];j++) {
      c[i+j-1] += a[i]*b[j];
      c[i+j] += c[i+j-1]/10;
      c[i+j-1] %= 10;
    }
  }
  len=a[0]+b[0];
  while((c[len] == 0) && (len > 1)) len--;
  for(i = len;i >= 1;i--)
  printf("%d",c[i]);
  return 0;
}

你可能感兴趣的:(c语言 高精度加,乘法实现详解)