階加演算法代碼
#include<stdio.h>
#define N 50 /*可以是任意一個數的階乘,當然要計算機能夠存的下*/
int main()
{
int a[100], l=0, i, j;
for(i=0; i<100; i++)
a[i]=0;
a[0]=1;
for(i=2; i<=N; i++)
{
for(j=0; j<=l; j++)
a[j] *= i;
l+=3;
for(j=0; j<l; j++)
if(a[j]>9)
{
a[j+1]+=a[j]/10;
a[j] %=10;
}
while(a[l]==0) l--;
}
for(i=l; i>=0; i--)
printf("%d", a[i]);
printf("\n");
}
看了 樓下兩個 用int 存儲 50!
感覺有點不可思議, 至少應該用double啊,用double雖然不能保證精度,但至少可以很接近結果。
3樓的 一句話:「老師說過,可以自已定義一個類型來表示更大的數。。。」
自己是可以定義,你可以定義任意類型。只不過需要你自己來實現。 50!這種問題 就相當於 大數 的操作。
網上可以下載到大樹類, 支持 大數的+ - * / 開平方, 開根號,(幾乎所有math里的函數)...。
B. 1到100的階乘代碼
給你100!
#include<stdlib.h>
#include<iostream.h>
#include<iomanip.h>
const int N=100;
int compute(unsigned int *s,int n)//s用來存儲一次的計算結果,n為本次計算的乘數,函數返回結果中有效數據的節數
{
unsigned long p; //暫時存放一節的結果
unsigned long more=0;//一次乘法的進位
int i; //循環變數
static int m=1;//存放結果中的節數,三位一節
static int q=0;//存放結果中最後為零的節數
//計算本次的結果
for(i=q;i<m;i++)
{
p=(long)s[i]*(long)n+more;
more=p/N;
s[i]=p-more*N;
}
//計算結果中最後為零的節數
while(s[q]==0)
q++;
//處理最高位
for(more=p/N;more;)
{
p=more;
more=p/N;
s[i++]=p-more*N;
m++; //有效節數增一
}
return m; //返回有效節數
}
void main()
{
unsigned int *s; //存放結果
int i; //循環變數
int m; //存放節數
int n; //求n的階乘
cout<<"請輸入一個正整數<0----100>:";
cin>>n;
if(n<0)
{
cout<<"輸入數據錯誤!"<<endl;
return;
}
else if(n==0)
{
cout<<"0!==1"<<endl;
return;
}
//初始化s
s=(unsigned int *)malloc(n*sizeof(s)*10);
for(i=1;i<n;i++) s[i]=0;
s[0]=1;
//計算結果
for(i=2;i<=n;i++)
m=compute(s,i);
while(s[m]==0)
m--;//過濾掉前面的零
//輸出結果
cout<<n<<"!=="<<s[m--];//最高一節
int num=1;
for(i=m;i>=0;i--)
{
num++;
cout<<','<<setw(3)<<setfill('0')<<s[i];
if((num%10)==0) cout<<endl;
}
cout<<endl;
//釋放空間
free(s);
}
JAVA的函數是一樣的.可惜JAVA的編碼我不會寫了.
C. 階乘的公式是什麼
n!=1×2×3×...×n。階乘亦可以遞歸方式定義:0!=1,n!=(n-1)!×n。
亦即n!=1×2×3×...×n。階乘亦可以遞歸方式定義:0!=1,n!=(n-1)!×n。
資料來源:階乘_網路
D. 階乘的程序和演算法
沒說要什麼語言編寫的,我給你一個Java的:
public class Factorial
{ public static int factorial(int x)
{
if (x < 0)
{
throw new IllegalArgumentException("x must be>=0");
}
int fact = 1;
for(int i = 2; i <= x; i++)
{
fact *= i;
}
return fact;
}
public static void main(String args[])
{
System.out.print(factorial(10));
}
}
E. python中n的階乘的演算法
我的代碼是
#encoding=utf-8
s=1
n=int(input("請輸入一個整數n:"))
for i in range(1,n+1):
s=s*i
print(n,"!=",s)
結果:
python3 a.py
請輸入一個整數n:5
5 != 120
F. 階乘的公式是怎樣的
程序源代碼:
/**
*計算大數的階乘,演算法的主要思想就是將計算結果的每一位用數組的一位來表示:如要計算5!,那麼首先將
*(1) a[0]=1,然後a[0]=a[0]*2,a[0]=2,
*(2) a[0]=a[0]*3,a[0]=6
*(3) a[0]=a[0]*4,a[0]=24,此時a[1]=2,a[0]=4
*/
public class Factorial
{
static int a[] = new int [10000];
static void factorial(int n)
{
for(int i=2; i< a.length; i++)
a[i] = 0; //將數組元素初始化
a[0] = 1; //用數組的一項存放計算結果的位數
a[1] = 1; //將第一項賦值為一
for(int j= 2; j <= n; j++)
{
int i=1;
int c = 0; //c表示向高位的進位
for(; i <= a[0]; i++)
{
a[i] = a[i] * j + c;//將來自低位的計算結果和本位的結果相加
c = a[i] / 10;
a[i] = a[i] % 10;
}
for(; c != 0; i++)
{
a[i] = c%10;
c = c / 10;
}
a[0] = i - 1;
G. c語言的求n的階乘的程序代碼
int f(int n)
{
if(n==1)
return 1;
else
return n*f(n-1);
}
這個是經典的迭代程序例子。
H. 求解:圖論中常見的最短路徑演算法有幾種都是什麼
主要是有三種、、
第一種是最直接的貪心dijkstra演算法、、可以利用堆數據結構進行優化、、缺點就是不能求有負權的最短路與判斷負環、、
第二種是bellman-ford演算法、、根據鬆弛操作的性質是可以來判斷負環的、、時間復雜度是O(nm)的、、
第三種是SPFA演算法、、把他單獨拿出來作為一種演算法並不是非常好的、、他的實質應該是上面的bellman-ford演算法的隊列優化時間復雜度更低、O(KE)、K的值約等於2、、