当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

高精度实现10000位数字的乘除法(C++)

    说明:做了个计算器,本来是要上传整个项目的,但突然发现不能上传资源了,就贴出来算法部分的代码,大家多多指点啊,呵呵,比较难读,以后再上传整个项目,呵呵

 //转换,供乘法部分调用
int turn(char s[], int num[])
{
 int i = 0, len, j;
 while(1)
 {
  if(s[i] == 0) break;
  else if(s[i] == '-' || s[i] == '0') i++;
  else break;
 }                 //i指向第一个非零数字
 for (j = 0; s[j] != 0; j++) ;
 j--;              //j指向最后数字
 for(len = 0; j >= i; j--, len++)
 {
  num[len] = (int)s[j] - 48;
 }
 return(len);
}

 

 

 

//转换,供除法部分调用
int turn2(char s[], int num[])
{
 int i = 0, len, j;
 while(1)
 {
  if(s[i] == 0) break;
  else if(s[i] == '-' || s[i] == '0') i++;
  else break;
 }                 //i指向第一个非零数字
 for (j = 0; s[j] != 0; j++) ;
 j--;              //j指向最后数字
 for(len = 0; j >= i; i++, len++)
 {
  num[len] = (int)s[i] - 48;
 }
 return(len);
}

void mul(int *a, int *b, int *c, int len1, int len2)
{
 int i, j;
 for (i = 0; i < len1; i++)
 {
  for (j = 0; j < len2; j++)
  {
   c[i + j] += a[i] * b[j];
   if (c[i+j] >= 10)
   {
    c[i+j+1] += c[i+j] / 10;
    c[i+j] = c[i+j] % 10;
   }
  }
 }
}

 

 

 

//比较大小,被Division函数调用
int cmp(int *a, int *b, int len1, int len2)
{
 int i, len, result = 0, j;
 for (i = 0; a[i] == 0; i++);
 len = len1 - i;
 if(len < len2) result = -1;
 else if(len > len2) result = 1;
 else
 {
  for (j = 0; i < len1, j < len2; i++, j++)
  {
   if (a[i] > b[j])
   {
    result = 1;
    break;
   }
   if (a[i] < b[j])
   {
    result = -1;
    break;
   }
  }
 }
 return(result);
}

 

 

//两数相除,被Division函数调用
void div(int *a, int *b1, int *c, int len1, int len2)
{
 int i, j, m, n, p, q, b[101], chb[101] = {0}, chlen, result_of_cmp;
 for (i = 1; i <= len1; i++)
 {
  for (j = 1; ;j++)
  {
   for (m = 0; m < len2; m++) b[m] = b1[m];
   for (m = len2 - 1; m >= 0; m--) b[m] *= j;
   for (m = len2 - 1; m > 0; m--)
   {
    if (b[m] >= 10)
    {
     b[m-1] += b[m] / 10;
     b[m] = b[m] % 10;
    }
   }
   if (b[0] >= 10)
   {
    chlen = len2 + 1;
    chb[0] = b[0] / 10;
    chb[1] = b[0] % 10;
    for (n = 2; n < chlen; n++) chb[n] = b[n-1];
   }
   else
   {
    chlen = len2;
    for (n = 0; n < chlen; n++) chb[n] = b[n];
   }
   result_of_cmp = cmp(a, chb, i, chlen);
   if(result_of_cmp == 0 || result_of_cmp == -1) break;
  }
  if(result_of_cmp == 0) c[i-1] = j;
  else c[i-1] = j - 1;
  for (p = i - 1, q = len2 - 1; p >= 0 && q >= 0; p--, q--)
  {
   a[p] = a[p] - b1[q] * c[i-1];
   while (a[p] < 0)
   {
    a[p-1]--;
    a[p] = a[p] + 10;
   }
  }
 }
}

 

 

 

 

//////////////乘法部分

HIGHPRECDLL_API void Multiply(char* a,char* b,char* c)
{
 int i, j, num1[101] = {0}, num2[101] = {0}, tmp[10001] = {0}, len1, len2;
 if((a[0] == '0' && a[1] == 0) || (b[0] == '0' && b[1] == 0)) { c[0] = '0'; c[1] = 0; return;}
 if((a[0] == '-' && a[1] == 0) || (b[0] == '-' && b[1] == 0)) { c[0] = '0'; c[1] = 0; return;}
 if((a[0] == '-' && a[1] == '0' && a[2] == 0) || (b[0] == '-' && b[1] == '0' || b[2] == 0)) { c[0] = '0'; c[1] = 0; return;}

 len1 = turn(a, num1);
 len2 = turn(b, num2);

 mul(num1, num2, tmp, len1, len2);

 for (i = 10000; tmp[i] == 0; i--) ;
 if ((a[0] == '-' && b[0] != '-') || (a[0] != '-' && b[0] == '-'))
 {
  c[0] = '-';
  for(j = 1; i >= 0; i--, j++) c[j] = '0' + tmp[i];
  c[j] = 0;
 }
 else
 {
  for(j = 0; i >= 0; i--, j++) c[j] = '0' + tmp[i];
  c[j] = 0;
 }
}

 

 

 

 

///////////////除法部分

HIGHPRECDLL_API void Division(char* a,char* b,char* c)
{
 int i, j, num1[101] = {0}, num2[101] = {0}, tmp[101] = {0}, len1, len2, mark;
 if(strcmp(b, "0") == 0 || strcmp(b, "-0") == 0) { strcpy(c, "Error"); return;}

 len1 = turn2(a, num1);
 len2 = turn2(b, num2);
 mark = cmp(num1, num2, len1, len2);
 if(mark == -1) { strcpy(c, "0"); return; }
 div(num1, num2, tmp, len1, len2);

 for (i = 0; tmp[i] == 0; i++) ;
 if ((a[0] == '-' && b[0] != '-') || (a[0] != '-' && b[0] == '-'))
 {
  c[0] = '-';
  for(j = 1 ; i < len1; i++, j++) c[j] = tmp[i] + '0';
  c[j] = 0;
 }
 else
 {
  for(j = 0; i < len1; j++, i++) c[j] = tmp[i] + '0';
  c[j] = 0;
 }
}

 

相关内容
赞助商链接