/* 可以把n!的结果放在数组中,数组中每个元素都表示n!值的一位. 对整数范围内的n,求n!. 对于输入的n想办法昼精确地估计出n!所占的位数.就能确定数组元素的个数 可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有=log10^n!即: M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,该M是n!的精确位数。 数组初始化时,令数组第一个元素(n!的第一位)为整数1,其余为0. 在数组中计算n!时是通过将数组中的值乘2,3,4,。。一直到乘n的方式得的 把数组的第一个元素看做是n!的最低位,最后一个元素看做是最高位。 */
#include <iostream>; using namespace std; #include <cmath>; #include <cstdlib>; #include <iomanip>;
int getN(); //输入n
int getBitNum(int n); //求n!的位数
char *init(int size); void calc(char *a,int n); //求n!
void display(char *a,int size);
int main() { int n = getN(); int size = getBitNum(n); char *pa = init(size); calc(pa,n); display(pa,size); delete []pa; //note:
}
int getN() { int n; cout << "Please input n of n! : "; cin >;>; n; while(n < 0) { cout << "input error,again: "; cin >;>; n; } if(n == 0) exit(1); return n; }
int getBitNum(int n) { double sum = 1.0; for(int i=1; i<=n; i++) sum += log10((long double)i); //参数为double &和long double&
//不转换重载函数不能解析
return int(sum); //不转换会有warning
}
char * init(int size) { char *pa = new char[size]; if(!pa) { //n太大时考虑申请内存不成功情况的执行动作
cout << "too large factor of " << size << endl; exit(1); } pa[0] = 1; for(int i=1; i<size; i++) pa[i] = 0; return pa; }
void calc(char *a, int n) { double bitcount = 1; int begin = 0;
for(int i=2; i<=n; ++i) { long add = 0; //源为long and=0;由于and是C++关键字,所以出错。
//故所有为add的源文为and.不小心的出错点。
bitcount += log10((long double)i); if(a[begin] == 0) begin++;
for(int j=begin; j<int(bitcount); ++j) { add += (i*a[j]); a[j] = char(add % 10); add /= 10; } } }
void display(char *a, int size) { int bit = 0; for(int i=size-1; i>;=0; i--) { if(bit % 50 == 0) cout << endl << "The" << setw(5) << (bit/50+1) << " /'s 50 bit: "; cout << int (a[i]); //思考:为什么需要进行显式的整形转换呢?
bit++; } cout << endl; }
|