精度计算-大数乘大数

精度计算                     大数乘大数

本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数)。

算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中。例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] =
res[0][0]= 1,s[1] = res[0][1]+res[1][0] = 4,s[2] = res[1][1] = 4,但是此时输出的话,结果是441,我们需要用for循环将结果逆置。更多位数的计算在过程上会更麻烦但远离上是一样的。

#include<stdio.h>
#include<string.h>
void mult(char a[],char b[],char s[]);
main()
{
	char a[65] = "12";
	char b[65] = "12";
	char s[130] = "";
	mult(a,b,s);
	printf("%s",s);
}
void mult(char a[],char b[],char s[])
{
	int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
	char result[65];
	alen=strlen(a);
	blen=strlen(b);
	for (i=0;i<alen;i++)
	{
		for (j=0;j<blen;j++)
		{
			res[i][j]=(a[i]-'0')*(b[j]-'0');
		}
	}
	for (i=alen-1;i>=0;i--)
	{
		for (j=blen-1;j>=0;j--)
		{
			sum=sum+res[i+blen-j-1][j];
		}
		result[k]=sum%10;
		k=k+1;
		sum=sum/10;
	}
	for (i=blen-2;i>=0;i--)
	{
		for (j=0;j<=i;j++)
		{
			sum=sum+res[i-j][j];
		}
		result[k]=sum%10;
		k=k+1;
		sum=sum/10;
	}
	if (sum!=0)
	{
		result[k]=sum;
		k=k+1;
	}
	for (i=0;i<k;i++)
	{
		result[i]+='0';
	}
	for (i=k-1;i>=0;i--)
	{
		s[i]=result[k-1-i];
	}
	s[k]='\0';
	while(1)
	{
		if (strlen(s)!=strlen(a)&&s[0]=='0')
			strcpy(s,s+1);
		else
			break;
	}
}

下面是我的C语言实现过程。

时间: 2024-08-06 20:43:53

精度计算-大数乘大数的相关文章

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中. 我们的思路是把每4位数看做数组的一个元素来存储,例如:个.十.百.千存在a[0],万.十万.百万.千万存在a[1]以此类推. 我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+

精度计算-大数加大数

精度计算                大数加大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数). 算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中. 下面是我的C语言实现过程 #include<stdio.h> #include<string.h> void add(char a[],char b

精度计算-大数乘小数

精度计算-大数乘小数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个小数(10以内的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再从最后一位开始于要乘的小数相乘并加上前一位的进位,如果有进位存入一个变量中,加到下一位的计算中去. 下面是我的C语言实现过程. int main() { char c[100] = "1231231231231231231231231231231232"; char t[101] ; int m = 10; mult(c

多精度计算备忘录之乘法 ------ 复杂度分析

多精度计算里,多精度乘法是其中最重要的运算之一,编写的多精度库(类)的其中一个重要效率标识就是其乘法的速度. 根据曾经写的大数类的记忆,简单记录下其中的一些技巧,以备查询. 一般的算法有如: 多精度乘法,所知的几个主要的优化方法有: 1:直接乘法. 2:comba乘法 3:Karatsuba乘法 4:toom_cook乘法 5:FFT乘法 6:FNT算法,或其他类似的有限域上对应类似的FFT算法 7:自己未曾理解的算法. 8:改进技巧, 1:直接乘法. a   b    c *         

高精度之大数乘大数

上一篇说了简单的大数乘以小数的问题,绝大多数的问题解决不了. 现在我们来说一下大数乘以大数. 大数乘以大数也是用来模拟手算. 举个例子吧! 先从个位开始一个一个的乘 乘完个位然后再乘十位,乘十位的时候要和个位的想成的结果相加. 这里注意乘十位的时候 就不要和乘个位数字的结果中的最后一位相加了 .就是如图搓位. 就是这样 . 下面先贴上我的代码. #include<iostream> #include<string.h> using namespace std; void mult(

php的精度计算问题(bcadd和bcsub)

一.前言 我们在进行php开发的时候经常会遇到浮点型的问题,特别是涉及金额的部分,常常需要进行加减运算.当小数点的位数比较多的时候,往往容易犯一些很低级的错误.这里记录一下php的精度计算和封装的小demo. 二.关于php的高精度问题 1.概念解释 这篇文章的解释最清楚: php高精度计算问题 2.高精度数值对比大小问题 下面这篇文章讲的很好: 临时发一个项目遇到的PHP浮点计算问题 默认保留两位小数 bcadd(参数1,参数2,参数3) 参数1 和2 是要相加的参数 3是保留几位小数. 1.

C++大数精度计算(带小数点)

转: (原出处不可考,若有侵权,请联系我立即删除) 头文件: // WTNumber.h: interface for the CWTNumber class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_WTNUMBER_H__92E62B40_491A_4A75_AB89_FFB160DB2343__INCLUDED_) #define AFX_WTNUM

iOS中计算两个大数相加算法(OC实现)

我们知道计算机的数据类型不同,所能表示的数据量级也不相同,比如: unsigned int : 0-4294967295   int : -2147483648-2147483647 unsigned long : 0-4294967295long :  -2147483648-2147483647long long : -9223372036854775808 ~ 9223372036854775807unsigned long long : 0 ~ 18446744073709551615

PHP 精度计算引发的灾难性Bug

在维护一个比较老的金融项目时,发现精度的计算简单粗暴,先来看一下代码片段: if($accountInfo['account_money'] < $repayMoney ){ rollback(); return false; } 如上代码片段变量所示,上面的代码主要是比较帐户余额及还款数,两者均为双精度浮点数,稍作修改代码,让我们能看到一些输出才更直观 if($accountInfo['account_money'] < $repayMoney ){ echo "{$account