下面代码是求阶层,调用: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中的常用高精度模板,内容:大数加法,大数乘小数,大数乘大数,大数除法。
大数除法算法 算法 大数加减乘除 高精度乘除法
高精度算法,包括大数加法,大数减法,大数乘法,大数除法,大数取余等高精度算法
实现了大数的加减乘方法,以及操作所用的到的链表
3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换(FFT 10.Ronberg 算法计算积分 11.行列式计算 12.求排列组合数 13...
用c++实现大数加减乘,绝对可以实现。希望分享
N进制大数相减,大数比较,大数乘法,大数乘浮点数(支持大数乘大数),大数阶乘,大数相加,大数相减(负数结果带符号),大数相减,大数之差(绝对值),浮点大数求幂(支持整数大数求幂),整数大数求幂
该算法用于实现RSA算法,新算法的效率有明显的提高
大数 加减乘 C++源代码 课程设计 上机实验 编程比赛 等可以使用
计算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语言无符号整形的大数加法和乘除法的源代码,自己编译通过,并且加有自己理解的注释!大数除法.cpp 大数乘法.cpp 大数加法.cpp
大数运算,加减乘除,逻辑运算,完整的程序,运算符重载。
大数乘法是公钥加密中最为核心的计算环节之一,快速实现大数乘法单元也是RSA、ElGamal、全同态等密码体制急需解决的问题之一。目前,基于C 的NTL GMP库函数虽然能在CPU上实现高精度的大数乘法,但其仍不能满足加密对...
(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公 倍数 8.组合序列 9.快速傅立叶变换 (FFT) 10.Ronberg 算法计算积 分 11.行列式计算 12.求排列组合数 字符串处理: 1....
大数相乘指数幂的实现 大数相乘指数幂的实现 大数相乘指数幂的实现
精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换(FFT) 10.Ronberg算法计算积分 11.行列式计算 12.求...
C#实现大数的加减乘运算。包含完整的asp.net项目,可以实现任意两个不限长度的正数的加、减、乘法运算。
3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换(FFT) 10.Ronberg算法计算积分 11.行列式计算 12.求排列组合数 ...