`
Dev|il
  • 浏览: 126145 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

大数乘大数

 
阅读更多
下面代码是求阶层,调用:Mul("123456", "123")
#include <iostream>
using namespace std;

const int MAX = 100002;
char result[MAX];
char a[MAX], b[MAX];
char res[MAX]; //小数乘大数的结果
//大数相乘模版
int atoi(char c)
{
	return c - '0';
}

char atoc(int N)
{
	return N + '0';
}

bool signMul(char c[], int N)
{
	int len, i, ans, j;
	char t;
	len = strlen(c);
	ans = 0;
	if(len > MAX)
		return false; //乘数过大,不能被结果数组保存
	for(i = len - 1, j= 0; i >= 0; i--)
	{
		res[j++] = atoc((atoi(c[i]) * N + ans) % 10);
		ans = (atoi(c[i]) * N + ans) / 10;
	}
	if(ans > 0)
		res[j++] = atoc(ans);
	for(i = 0; i < j / 2;  i++)
	{
		t = res[i];
		res[i] = res[j - i - 1];
		res[j - i - 1] = t;
	}
	res[j] = '\0';
	return true;
}

//大数相加
void Add(char a[], char b[])
{
	int alen = strlen(a);
	int blen = strlen(b);
	int i, j, ans, k;
	char c;
	for(i = alen - 1, j = blen - 1, ans = 0, k = 0; i >= 0 && j >= 0; i--, j--)
	{
		result[k++] = atoc((atoi(a[i]) + atoi(b[j]) + ans) % 10);
		ans = (atoi(a[i]) + atoi(b[j]) + ans) / 10;
	}
	while(i >= 0)
	{
		result[k++] = atoc((atoi(a[i]) + ans) % 10);
		ans = (atoi(a[i]) + ans) / 10;
		i--;
	}
	while(j >= 0)
	{
		result[k++] = atoc((atoi(b[j]) + ans) % 10);
		ans = (atoi(b[j]) + ans) / 10;
		j--;
	}
	if(ans > 0)
		result[k++] = atoc(ans);
	for(i = 0; i < k / 2; i++)
	{
		c = result[i];
		result[i] = result[k - i - 1];
		result[k - i - 1] = c;
	}
	result[k] = '\0';
}
//乘的最终结果放在result数组中
bool Mul(char a[], char b[])
{
	int alen = strlen(a);
	int blen = strlen(b);
	int len, i, j, reslen;
	char temp[MAX];
	result[0] = '\0';
	for(i = blen - 1; i >= 0; i--)
	{
		signMul(a, atoi(b[i]));
		len = strlen(result);
		for(j = 0; j < len; j++)
		{
			temp[j] = result[j];
		}
		temp[len] = '\0';
		reslen = strlen(res);
		for(j = 0; j < blen - 1- i; j++)
		{
			res[reslen + j] = '0';
		}
		res[reslen + j] = '\0';
		Add(temp, res);
	}
	return true;
}
int main()
{
	int n, i, len, j;
	while(cin>>n)
	{
		result[0] = '1';
		result[1] = '\0';
		a[0] = '1';
		a[1] = '\0';
		if(n == 1 || n == 0)
		{
			cout<<'1'<<endl;
			continue;
		}
		for(i = 2; i <= n; i++)
		{
			sprintf(b, "%d", i);
			Mul(a, b);
			len = strlen(result);
			for(j = 0; j < len; j++)
				a[j] = result[j];
			a[len] = '\0';
		}
		printf("%s\n", result);
	}
	return 0;
}
分享到:
评论

相关推荐

    大数运算,大数与小数运算,阶乘

    计算 大数加大数 大数减大数 大数乘大数 大数乘小数 小数阶乘 数组处理

    c++大数模板,加减乘除阶乘求幂N进制

    `大数乘浮点数(支持大数乘大数).cpp`可能涉及到浮点数的转换和精度控制。 5. **大数阶乘**:计算大数的阶乘需要处理大数的乘法和溢出问题。可以使用循环或递归方式实现,但递归可能会导致栈溢出,因此一般推荐...

    算法 大数加减乘除 高精度乘除法

    在本文中,我们提供了一个完整的高精度大数加减乘除法的实现代码,包括大数加法、减法、乘法和除法等运算。该代码使用 C 语言实现,能够正确地处理大数运算并输出正确的结果。 高精度大数运算的应用非常广泛,例如...

    大数加减乘类的实现

    本项目实现了一个大数加减乘的类,结合链表数据结构来存储和处理这些大数。 首先,我们来讨论大数的基本概念。在计算机中,常规的数据类型如int、long等都有其最大值和最小值限制,例如在Java中,int的最大值为2^31...

    gaojingdu.rar_c 大数加法_c++大数除法_大数 加 减 乘 除_大数算法_高精度

    在标题“gaojingdu.rar_c 大数加法_c++大数除法_大数 加 减 乘 除_大数算法_高精度”中,我们关注的是用C语言和C++实现的高精度算法,特别是大数的加法、减法、乘法和除法。这些操作是基础数学运算,但在计算机中...

    ACM大数模板(c/c++)

    ACM中的常用高精度模板,内容:大数加法,大数乘小数,大数乘大数,大数除法。

    大数模幂乘算法的快速实现

    ### 大数模幂乘算法的快速实现:深入解析与应用 #### 引言 自1976年Diffie和Hellman发表了《密码学新方向》以来,一系列的密码算法如雨后春笋般涌现,其中最为人所熟知且被认为安全有效的公钥算法包括RSA算法、...

    密码学 模n的大数幂乘的快速算法

    其中,模n的大数幂乘运算是一项非常基础且重要的操作。这种运算通常表示为\( x^r \mod n \),即求\( x \)的\( r \)次幂后再对\( n \)取模的结果。本文将详细介绍一种计算\( x^r \mod n \)的快速算法,并分析其背后的...

    大数加减乘运算C++源代码

    "大数加减乘运算C++源代码" 本资源提供了一个使用C++语言实现的大数加减乘运算的源代码,uitable for课程设计、上机实验、编程比赛等场景。 大数运算是指对大整数或大浮点数进行加、减、乘、除等运算的大数运算。...

    大数运算 大数相加 大数相乘

    - 将所有移动后的乘积累加到结果数组中,注意处理进位。 3. 清理结果,去除前导零。 在C/C++中,为了提高代码可读性和可维护性,通常会封装成类或结构体,包含如`add`、`multiply`这样的成员函数,以便于管理和...

    ACM经典代码

    以下是一些ACM经典代码,用于解决大数的精度计算问题,包括大数阶乘、大数乘法(大数乘小数与大数乘大数)以及大数加法。 1. 大数阶乘: 这个代码实现了一个计算大数阶乘的函数`factorial`。它使用一个`long`类型的...

    ACM常用算法介绍及模板.pdf

    大数乘大数是指两个大数之间的乘法运算,这类问题需要使用高精度算法来保持运算的精度。 4. 精度计算——加法 大数加法是指两个大数之间的加法运算,这类问题需要使用高精度算法来保持运算的精度。 5. 精度计算...

    C++大数加减乘

    用c++实现大数加减乘,绝对可以实现。希望分享

    ACM内部函数.doc

    以下是从给定文件中提取出的一些关于ACM内部函数的知识点,主要涉及大数的精度计算,包括大数阶乘、大数乘小数和大数乘大数的算法实现。 1. 大数阶乘: 阶乘运算通常用于组合数学和概率论中。在ACM编程中,由于`...

    ACM常用算法介绍 ACM常用算法介绍

    大数乘大数时,需要使用高精度算术库或自行实现高精度算法来避免溢出或精度损失。 4. 精度计算——加法 在进行大数加法时,需要注意精度的问题,使用高精度算术库或自行实现高精度算法可以解决这个问题。 5. 精度...

    大数加减乘除c++类

    这个题目涉及到了创建一个名为`BigInteger`的类来实现大数的加、减、乘、除运算以及比较操作。这里我们将详细解析这段代码中的各个部分。 首先,`BigInteger`类有两个私有成员变量:`vector&lt;int&gt; num`用于存储大数...

    大数运算c语言代码

    大数乘法可以使用Karatsuba算法或Toom-Cook算法,但这里介绍最基础的“列乘”法。这种方法与小学乘法类似,把一个数拆分成多个部分,然后逐行相乘并累加。步骤如下: 1. 将两个大数按位展开成二维矩阵。 2. 对每个...

    教案ACM小组内部预定函数.pdf

    - **大数乘法**:大数乘法包括乘法(大数乘小数)和乘法(大数乘大数)。大数乘小数可以通过将小数乘以大数的每一位,然后累加结果。大数乘大数则需要更复杂的算法,如Karatsuba或Toom–Cook算法。 2. **字符串...

    大数相乘指数幂的实现

    对于大数的指数幂运算,直接的暴力方法是通过重复自乘来实现,即A^B = A * A * ... * A (B次),这在B较大时非常低效。因此,人们提出了快速幂算法(Fast Exponentiation),它基于幂运算的结合律和分配律,将A^B转化...

    ACM函数整理_ACM模板

    大数乘小数可以通过简单的乘法运算实现,而大数乘大数则可能需要Karatsuba算法或Toom–Cook算法来提高效率。 2. **加法与减法**:大数的加法和减法相对简单,主要通过模拟十进制运算规则进行。 3. **任意进制转换*...

Global site tag (gtag.js) - Google Analytics