1. 怎样计算大数阶乘 最好有程序。
我宏塌唤在网上找到了一个计算大数阶乘位数的算法,效率相当可观:
例如1000阶乘位数:
log10(1)+log10(2)+···+long10(1000)取整后加1
或者
log(N!)=lnN!/ln10
=(NlnN-N)/ln10
=2565.7
so
N!=10^2565.7
=10^.7*10^2565
=5.01e2565
然后,计算大数阶乘,只能靠计算机,用高精度,程序如下:
vara:array[1..10000000]oflongint;
n,i,j,ans,mark:longint;
procerefindmark;
vari:longint;
begin
fori:=10000000downto1do
ifa[i]>0then
begin
mark:=i;
exit;
end;
end;
begin
a[1]:=1;
readln(n);
fori:=2tondo
begin
ans:=0;
mark:=mark+5;
forj:=1tomark+5do
begin
a[j]:=a[j]*i+ans;
ans:=a[j]div10;
a[j]:=a[j]mod10;
end;
end;
findmark;
fori:=mark蔽凯downto1do
write(a[i]);
writeln;
end.
这里还附上一个可执行文件,输入n,可衫中以输出n!
2. C语言设计一个程序求大数的阶乘,如10000的阶乘
写的一个C++实现10000的阶乘的代码
#include<iostream>
#define N 10000//设阶乘数为10000
#define SIZE 40000//预留40000位芦肆保存结果
using namespace std;
void mul(int *n1,int n2)//两数相乘
{
for(int i=0;i!=SIZE;++i)
n1[i]*=n2;
for(int i=0;i!=SIZE;++i){
n1[i+1]+=(n1[i]/陪野轿10);
n1[i]%=10;
}
}
int main()
{
int *num=new int[SIZE];
memset(num,0,SIZE);
num[0]=1;
//N的阶乘
for(int i=1;i!=N+1;++i){
mul(num,i);
}
//输出时排除开头的0
for(int i=SIZE-1;i!=-1;--i){
if(0!=num[i]){
for(int j=i;j!=-1;--j){
cout <<num[j];
}
break;
}
}
delete[] num;
return 0;
}
很多地方不合理,尤其是需要预留空间,这就要我先预算一下会有多少位了。运算时间20秒左右,效率也脊物不行,应该在10秒左右比较合理,机器为P3 733,内存256MB。
3. C语言课程设计实验报告 大数阶乘 问题描述 对给定的n(n≤100),计算并输出k!(
#include stdafx.h
#include iostream.h
long digui(int n);
int main()
{
int n;
long dg;
cout输入一个数,求它的正亏乘喊清郑阶: ;
cinn;
dg=digui(n);
cout这个数的乘阶为郑颂: dgendl;
return 1;
}
long digui(int n)
{
long dg;
if(n==1)
{
dg=1;
}
else
{
dg=digui(n-1)*n;
}
return (dg);
}
4. 求大神给个C语言大数阶乘的程序,要有注释的!
对于求大整数的阶培胡模乘,可以采用分段相乘的方法,其理论基础是加法的分配律,乘法的分配律。
for
exmaple
:123456789*123=123*(123*10^5+56789)=123*123*10^5+123*56789;
如果我们用一个数组result[0]=56789,result[1]=123,那么123456789*123就是123*result[0]%10^6和result[1]*123+result[0]/10^6构成的一个数,另result[0]=123*result[0]%10^6,result[1]=result[1]*123+result[0]/10^6,则这个数就是result[1]result[0];
#include<stdio.h>
int
main()
{
int
n,j,i,t,p;
int
result[16000];
while(scanf("%d",&n)!=EOF){
t=p=0;result[0]=1;
//t记录result中所存数的个数
for(j=1;j<配缓=n;j++){
//n!=1*2*3*4...*n;
for(i=0;i<=t;i++){
result[i]=result[i]*j+p;
//如果sum>99999不成立,则不需进位,进位为0
p=result[i]/100000;
//进位
result[i]%=100000;
//数组sum中每位存5位做中数字
}
if(p){
//t在最高位有进位的情况下++,最高位存进位
,并让进位为0
t++;
result[t]=p;
p=0;
}
//
如果进位不为0,
则下一次乘的时候将加上该进位,显然不合理
}
printf("%d",result[t]);//先把最高位输出,因为最高位没有前导0
for(i=t-1;i>=0;i--)
printf("%05d",result[i]);//s[i]不足5位,说明需补0
也说明result[i]在对100000取余的时候去掉了前导0,所以这里要加上
printf("\n");
}
return
0;
}
5. 设计一个求整数 n的阶乘程序
如果 n! 很大. 请用:
//=============================================
//该程序的计算结果正确与否可以通过google计算器验证,但是google的阶乘运算目前(2009/08/04)只能到170!,该程序能运算10000以下整数的阶乘;
//通过分析该模拟算法知道:可以通过调大MOD_OF_ARY值提高计算效率,但是要保证MOD_OF_ARY 与MAX_NUM的积小于所在平台的有符号整形数最大值(即不至于溢出),与此同时printf函数调用中的格式输出宽度也要做相应的调整(即该有效输出位宽度数值上等于MOD_OF_ARY后面零的个数);并且MOD_OF_ARY不能小于MAX_NUM
http://www.google.cn/ig/calculator?hl=zh-CN&q=100!
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 100
#define MOD_OF_ARY 10000
int main(){
static int ary[MAX_NUM] = { 1 };
int i, j;
int width; /*---表示结果的"宽度"---*/
int current_num; /*--- 当前数字 ---*/
/*--- 从大到小进行阶乘计算 ---*/
for( width = 0 , current_num = MAX_NUM ; current_num > 1; current_num-- ){
/*--- 对每一个‘分段’进行运算 ---*/
for( i = j = 0; i <= width; i++ ){
/*--- 当前运算的‘有效数值’ ---*/
ary[i] = ( (j += ary[i] * current_num) ) % MOD_OF_ARY;
/*--- 当前运算的‘进位数值’ ---*/
j /= MOD_OF_ARY;
}
if ( ary[i] = j ){ /*如果有进位,则索引向前推进*/
width++;
}
}
printf ( "%d", ary[width] );
/*--- 将求的数值输出 ---*/
for( j = width - 1; j >= 0; j-- ){
printf( "%04d", ary[j] );/*--- 这里的6跟MOD_OF_ARY的位数有关 ---*/
}
printf ("\n");
system ("pause");
}
6. C或C++程序设计 求大数阶乘
//输入阶乘数,先计算结果的位数,再动态申巧悄请相应的空间,用字符数组保存结果。
int input;
cin >> input;
double numlen = 1.0;
for(int temp=1; temp<=input; temp++)
numlen += log10((double)temp);
cout << (int)numlen << endl;
char *result = new char[(int)numlen+1];
result[(int)numlen] = '\0';
result[0] = '1';
int lenght = 1;
clock_t start,end;
start = time(0);
for (int i = 1; i<=input; i++)
{
int c = 0; //进位标志
for (int j=0; j<lenght; j++)
{
int buf = (result[j]-'握宽旦0'段扰) * i + c; //计算结果
result[j] = buf % 10 + '0'; //取当前位
c = buf / 10; //计算进位
}
while (c)
{
result[lenght++] = c % 10 +'0'; //取当前位
c /= 10; //计算进位
}
}
end = time(0);
for (int k=lenght-1; k>=0; k--)
{
cout<<result[k];
}
cout<<endl;
cout << difftime(end, start) << endl;
cout<<"length="<<lenght<<endl;
delete[] result;
要算出100000!要366秒,比较久,不知道有没有别的方式,这个只是按位计算的!