导航:首页 > 编程语言 > 大数阶乘程序设计报告

大数阶乘程序设计报告

发布时间:2023-03-28 18:52:42

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秒,比较久,不知道有没有别的方式,这个只是按位计算的!

阅读全文

与大数阶乘程序设计报告相关的资料

热点内容
为什么淘宝app是黑色的 浏览:17
如何在cad中把图形输出为pdf文件 浏览:535
文件夹横签 浏览:988
extjs5mvc 浏览:614
win7如何安装数据库 浏览:647
informix数据库倒数卸数 浏览:983
华硕p7h55mplus升级 浏览:240
servlet调用jsp 浏览:481
文件的命名原则有哪些 浏览:352
苹果的文件管理是哪个 浏览:387
智能黑板如何给pdf文件做批注 浏览:788
哈弗智联app如何绑定二手车 浏览:728
cad文件不多可是异常增大 浏览:872
苹果手机怎样将音频文件导入剪映 浏览:432
2016秋季飞歌导航升级 浏览:151
电脑字符串怎么编程 浏览:381
暴风不能在线观看视频文件 浏览:267
三国卡可以升级吗 浏览:939
如何筛选出相同数据 浏览:311
vbox文件找不到 浏览:49

友情链接