本来只是想为了理解算法,把书上的代码尝试实现下的,结果心血来潮,又写了一个小程序,写到一半感觉太浪费时间,也就草草收场了。程序不是很完整,凑合着用还是没问题的。
#include <iostream> #include <cstdlib> using namespace std; const int MAXN = 50000; // MAXN为计算的最高位数 void liancheng(int n,int m,int a[]) // n中取m高精度算法A(n,m) { int i, j, t; // t为临时变量 int &k = a[0] = 0; // 用a[0]存储值的位数,k引用a[0] t=n; while(t) { a[++k]=t%10; t/=10; } // 分离被乘数n各位到数组 for(i=n-1;i>=n-m+1;i--) // 乘数相继为n-1,n-2...n-m+1 { t=0; for(j=1;j<=k;j++) { a[j]=a[j]*i+t; t=a[j]/10; a[j]%=10; } while(t) { a[++k]=t%10; t/=10; } } } int fun1() { static int n = 0; int i,a[MAXN]; if(!n) { cout << " 计 算 阶 乘 的 说 明\n" << "1、输入0可以返回上级菜单\n" << "2、每次输入要计算的N值即可,程序会计算N!\n" << "3、N必须为1~1000内的整数\n\n"; } cout << ">> "; cin >> n; if(n==0) return 0; else if(n<1||n>1000) { cout << "输入非法!\n"; return 1; } liancheng(n,n,a); cout << n << "! = "; for(i=a[0];i>0;i--) cout << a[i]; cout << "\n\n"; return n; } int fun2() { static int n = 0; int i,m,a[MAXN]; if(!n) { cout << " 计 算 阶 乘 的 说 明\n" << "1、输入0可以返回上级菜单\n" << "2、每次输入要计算的n,m值即可(空格隔开),程序会计算A(n,m)\n" << "3、请用户自己控制输入数据的合法性\n\n"; } cout << ">> "; cin >> n; if(n==0) return 0; cin >> m; liancheng(n,m,a); printf("A(%d,%d) = ",n,m); for(i=a[0];i>0;i--) cout << a[i]; cout << "\n\n"; return n; } int fun3() { static int n = 0; int i,j,m,a[MAXN],b[MAXN],t; int &k = a[0]; if(!n) { cout << " 计 算 阶 乘 的 说 明\n" << "1、输入0可以返回上级菜单\n" << "2、每次输入要计算的n,m值即可(空格隔开),程序会计算C(n,m)\n" << "3、请用户自己控制输入数据的合法性\n\n"; } cout << ">> "; cin >> n; if(n==0) return 0; cin >> m; liancheng(n,m,a); for(i=2;i<=m;i++) { t = 0; for(j=k;j>0;j--) { t = a[j] + t*10; b[j] = t/i; t %= i; } while(b[k]==0) k--; for(j=1;j<=k;j++) a[j]=b[j]; } if(m==0) k=1,a[1]=1; printf("C(%d,%d) = ",n,m); for(i=a[0];i>0;i--) cout << a[i]; cout << "\n\n"; return n; } int main() { int i,a[MAXN],b[MAXN],c,n,m; do { system("cls"); cout << "\t阶乘、排列、组合高精度运算\n\n"; cout << "请选择(阶乘:1 排列:2 组合:3 退出:0) >> "; cin >> c; if(!c) break; switch(c) { case 1: while(fun1()); case 2: while(fun2()); case 3: while(fun3()); default: continue; } }while(1); return 0; }