導航:首頁 > 編程語言 > 大數階乘程序設計報告

大數階乘程序設計報告

發布時間: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

友情鏈接