`
Dev|il
  • 浏览: 122159 次
  • 性别: 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语言实现,包括大数除大数、大数乘大数。

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

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

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

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

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

    高精度算法,包括大数加法,大数减法,大数乘法,大数除法,大数取余等高精度算法

    大数加减乘类的实现

    实现了大数的加减乘方法,以及操作所用的到的链表

    ACM函数整理_ACM模板.pdf

    3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换(FFT 10.Ronberg 算法计算积分 11.行列式计算 12.求排列组合数 13...

    C++大数加减乘

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

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

    N进制大数相减,大数比较,大数乘法,大数乘浮点数(支持大数乘大数),大数阶乘,大数相加,大数相减(负数结果带符号),大数相减,大数之差(绝对值),浮点大数求幂(支持整数大数求幂),整数大数求幂

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

    该算法用于实现RSA算法,新算法的效率有明显的提高

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

    大数 加减乘 C++源代码 课程设计 上机实验 编程比赛 等可以使用

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

    计算x的r方 mod n的快速算法 (1)a,b,c (2)如果b=0,则输出结果c,结束。 (3) 如果b mod 2 !=0,则转到第(5)步。 (4)b,a(a*a)mod n,转第(3)步。 (5)b,c(c*a)mod n,转第(2)步。

    大数运算c语言代码

    C语言无符号整形的大数加法和乘除法的源代码,自己编译通过,并且加有自己理解的注释!大数除法.cpp 大数乘法.cpp 大数加法.cpp

    大数加减乘除c++类

    大数运算,加减乘除,逻辑运算,完整的程序,运算符重载。

    论文研究-大数乘法的GPU加速实现.pdf

    大数乘法是公钥加密中最为核心的计算环节之一,快速实现大数乘法单元也是RSA、ElGamal、全同态等密码体制急需解决的问题之一。目前,基于C 的NTL GMP库函数虽然能在CPU上实现高精度的大数乘法,但其仍不能满足加密对...

    ACM常用代码

    (大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公 倍数 8.组合序列 9.快速傅立叶变换 (FFT) 10.Ronberg 算法计算积 分 11.行列式计算 12.求排列组合数 字符串处理: 1....

    大数相乘指数幂的实现

    大数相乘指数幂的实现 大数相乘指数幂的实现 大数相乘指数幂的实现

    acm常用代码及算法

    精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换(FFT) 10.Ronberg算法计算积分 11.行列式计算 12.求...

    C#实现大数的加减乘运算

    C#实现大数的加减乘运算。包含完整的asp.net项目,可以实现任意两个不限长度的正数的加、减、乘法运算。

    ACM 内部预定函数

    3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换(FFT) 10.Ronberg算法计算积分 11.行列式计算 12.求排列组合数 ...

Global site tag (gtag.js) - Google Analytics