大数阶乘代码
大数阶乘,以前写的,都放到博客上来吧。没用多少C++的东西,改吧改吧就可以改成C的。
/**
* @file big_num_factorial.cpp
* @brief Get the factorial of a big number
* @author Guangming Mao<maogm12 AT gmail.com>
* @version 1.0
* @date 2012-04-19
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int get_num();
int get_digit(int);
char* get_memory(int);
int get_result(char*, int);
int print_result(char*, int);
int main()
{
int num = get_num();
int result_len = get_digit(num);
char *result = get_memory(result_len);
if (!get_result(result, num))
print_result(result, result_len);
delete [] result;
return 0;
}
/**
* @brief Get the number input
*
* @return The number input
*/
int get_num()
{
int tmp;
cout << "Please input a number(>0): ";
while (cin >> tmp)
{
if (tmp < 0)
cout << "Invalid number(<0), Input again: ";
else
break;
}
return tmp;
}
/**
* @brief Get the digits of the result
*
* @param num The number input
*
* @return Digits of the result
*/
int get_digit(int num)
{
double digit = 1.0;
for (int i = 1; i <= num; ++i)
digit += log10(i);
return (int)digit;
}
/**
* @brief Allocate enough memory for result
*
* @param digit The number of digit of the result
*
* @return A string of char to store the result
*/
char* get_memory(int digit)
{
char *result = new char[digit];
if (result == NULL)
{
cout << digit << "is too much, cannot allocate so much memory" << endl;
exit(1);
}
result[0] = 1;
for (int i = 1; i < digit; ++i)
result[i] = 0;
return result;
}
/**
* @brief Calculate the result
*
* @param result The result string
* @param num The number input
*
* @return 0 for success
*/
int get_result(char *result, int num)
{
double digit = 1.0;
int begin = 0;
long tmp = 0;
for (int i = 2; i <= num; ++i)
{
digit += log10(i);
if (*(result+begin) == 0)
begin++;
for (int j = begin; j < (int)digit; ++j)
{
tmp += *(result+j)*i;
*(result+j) = tmp%10;
tmp /= 10;
}
}
return 0;
}
/**
* @brief Print the result
*
* @param result The result string
* @param len The length of the result
*
* @return 0 for success
*/
int print_result(char *result, int len)
{
cout << "The result has " << len << " digits. and it is :" << endl;
for (int i = len - 1; i >= 0; --i)
{
cout << (int)*(result+i);
}
cout << endl;
return 0;
}