[华为机试练习题]17.可怕的阶乘

时间:2022-04-12 11:49:45

题目

题目标题:

计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值。例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围。请设计一个程序,使其可以计算100以内的数的阶乘,结果用字符串的形式输出
详细描述:

接口说明
原型:
void CalcNN(int n, char *pOut)
输入参数:
int n 需要计算的阶乘数
输出参数:
char *pOut 结算结果,内存由调用者负责管理
返回值:

限制:

举例:

题目来源: 软件训练营
练习阶段: 中级

代码

/*---------------------------------------
* 日期:2015-06-30
* 作者:SJF0115
* 题目:可怕的阶乘
* 来源:华为上机
-----------------------------------------*/

#include <iostream>
#include <string.h>
#include "oj.h"
using namespace std;

void CalcNN(int n, char *pOut){
if(pOut == NULL || n < 0){
return;
}//if
int index = 0;
pOut[index++] = '1';
if(n == 1 || n == 0){
pOut[index] = '\0';
return;
}//if
// 计算阶乘
int tmp,carry;
for(int i = 2;i <= n;++i){
// 进位清0
carry = 0;
// i与当前计算阶乘结果的每一位相乘
for(int j = 0;j < index;++j){
tmp = (pOut[j] - '0') * i + carry;
pOut[j] = tmp % 10 + '0';
carry = tmp / 10;
}//for
// 还有进位
while(carry){
pOut[index++] = carry % 10 + '0';
carry /= 10;
}//while
}//if
pOut[index] = '\0';
// 翻转
for(int i = 0,j = index-1;i < j;++i,--j){
swap(pOut[i],pOut[j]);
}//for
}