[華為機試練習題]17.可怕的階乘


題目

題目標題:

計算階乘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
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com