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

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

//转换,供乘法部分调用
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;
 }
}

时间: 2024-09-17 04:39:11

C++高精度实现10000位数字的乘除法的相关文章

c语言-10000这个数字二进制存储形式和内存存储形式一样吗

问题描述 10000这个数字二进制存储形式和内存存储形式一样吗 这个是c语言程序设计第三版297页上的图片 为什么图上二进制存储形式和内存存储形式的第二个框中的数字不一样?另外就是他为啥是2个字节? 老师ppt上用100做的例子,内存那边也是两个框,到二进制存储就变成一个框了,,,为啥.... 解决方案 首先ASCII码是把整数100当成3个字符来识别的'1''0''0'对应ASCII码表上分别是49.48.48(十进制).(二进制)为00110001.00110000.00110000 C语言

php生成4位数字验证码的实现代码_php技巧

在php中实现验证码还是很方便的,关键点在于掌握php gd库与session的用法. 纵观网上php 生成验证码的例子,无不是php gd库与session相结合,并利用php 生成随机数的方法来完成. PHP验证码,可以分为很多种,包括 php 图片验证码,php 随机验证码,以及php 中文验证码等,根据不同的应用场合来使用不同的验证码. 这里分享一个php数字验证码,供大家参考. 4位数字验证码 /* *Filename:authpage.php */ session_start();

C++实现输出三位数字的水仙花数

问题描述 C++实现输出三位数字的水仙花数 水仙花数是指一个n(>=3)位数字的数,它等于每个数字的n次幂之和. 编程输出3位水仙花数 解决方案 void main() { int n = 100; int a, b, c; for( n=100;n<=999;n++) { a = n/100; b = n/10%10; c = n%10; if ( n==(a*a*a+b*b*b+c*c*c)) { printf("%d %d %dn",a,b,c); } } }

java-JAVA连位数字判断如,1234 ,7890,8901,9012求解决

问题描述 JAVA连位数字判断如,1234 ,7890,8901,9012求解决 如题,求高手解答在线等,我现在只实现了,1234这种的不能实现8901这种的,public static boolean isDescNumeric(String numOrStr) { boolean flag = true; for (int i = 0; i < numOrStr.length(); i++) { if (i > 0) { int num = Integer.parseInt(numOrSt

excel中怎么将8位数字转换为日期格式?

  excel中怎么将8位数字转换为日期格式?            1.以EXCEL 2010为例:打开含有文本型日期的EXCEL表格文件,图中红框所示就是文本型日期,如图所示: 2.选中所有日期单元格,出现一个方形惊叹号,如图所示: 3.鼠标指向惊叹号,我们依次点击"倒三角"-〉"转换为数字": 4.点击后,这时文本型已经转换成数字型了,如图所示: 5.然后鼠标指向已选中的日期单元格,单击鼠标右键-〉"设置单元格格式": 6.弹出"

excel超过12位数字如何下拉递增和保存?

  下面为大家介绍excel超过12位数字如何下拉递增和保存方法,有需要的朋友可以参考本文,希望能对大家有所帮助! 方法/步骤 打开EXCEL,在A1输入前面的数字,超过12位的选择文本,在B1输入后几位数字. 往下拉 在C1输入=A1&B1 往下拉,就可以了.设置成文本格式,复制到新的EXCEL,就完成了. 以上就是excel超过12位数字如何下拉递增和保存方法介绍,操作很简单的,大家学会了吗?希望能对大家有所帮助!

javascript-java script 语句,判断用户名必须为8位数字的语句怎么写?

问题描述 java script 语句,判断用户名必须为8位数字的语句怎么写? 我在做一个用户注册页面,想用java script 语句,判断用户名必须为8位数字,这个语句怎么怎么写? 解决方案 <!DOCTYPE html> <html> <script type="text/javascript"> function validate(){ var reg = /^d{8}$/; //定义正则表达式 var obj = document.getE

算法-java有1234个数字能组成多少个有两个重复的3位数字

问题描述 java有1234个数字能组成多少个有两个重复的3位数字 java有1234四数字能组成多少个有两个重复的3位数字,java有1234四数字能组成多少个有两个重复的3位数字,java有1234四数字能组成多少个有两个重复的3位数字 解决方案 2 6*C 1234 解决方案二: 6*C下面是1234,上面是2 解决方案三: 如果我没理解错你的意思,那么这题是一个从四个数字中选出两个进行三位数字的排列组合的问题.根据大学(还是高中?)的排列组合知识就是: C2/4 乘以 3 =36种,具体

Extjs中用正则表达式输入必须是1-3位数字,不能有.和-

问题描述 Extjs中用正则表达式输入必须是1-3位数字,不能有.和- Extjs中用正则表达式输入必须是1-3位数字,不能有.和- 解决方案 ^[0-9]{1,3}$