N! hdu 1042

N!

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 84139    Accepted Submission(s): 24802

Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
 
Input
One N in one line, process to the end of file.
 
Output
For each N, output N! in one line.
 
Sample Input
1 2 3
 
Sample Output
1 2 6
 
Author
JGShining(极光炫影)
 
题解看注释吧,我妈叫我吃饭了
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
 
char a[100005], result[100005];//是动态数组,a和result用于互传
int b;//单纯一个数字
 
int m[100005], p[100005];//m是把a从字符串转成数字用于计算
//————————————————————其实可以把m和p合并缩短代码这俩都是中间计算用的
//字符型a>>>>m>>>>p>>>>result>>>a>>>循环
// 大数乘小数
// 大数a乘以小数b,结果返回给result
void b_s(char a[], int b, char result[])
{
    // 初始化
    memset(m, 0, sizeof(m));
    memset(p, 0, sizeof(p));
    int len = strlen(a);//每次计算一遍计算a的长度
    for(int i=0; i<len; ++i)// 把a逆序赋给m整形数组
        m[i] = a[len-i-1]-'0';
    for(int i=0; i<len; ++i)// 逐位相乘结果存入int型p中
        p[i] = m[i]*b;
    for(int i=0; i<len; ++i)// 对p处理,满十进一
    {
        if(p[i]>=10)
        {
            p[i+1] += p[i]/10;
            p[i] = p[i]%10;
        }
    }
    while(p[len])//单独判断要是p的最后一位大于十,进位
    {
        if(p[len]>=10)
        {
            p[len+1] += p[len]/10;
            p[len] = p[len]%10;
        }
        len++;
    }
    for(int i=0; i<len; ++i)//还原成字符串到result方便输出
       result[i] = p[len-i-1]+'0';//把a
    result[len] = 0;//结束
}
 
int main()
{
    int n;
    while(cin >> n)
    {
        if(n == 0 || n == 1)//特例+开头
        {
            cout << 1 << endl;
            continue;
        }
        memset(a, 0, sizeof(a));
        memset(result, 0, sizeof(result));
        a[0] = '1';//初始化开头
        for(int i=2; i<=n; ++i)
        {
            b_s(a, i, result);
            strcpy(a, result);//字符串中的函数把result复制到a里
        }
        for(int i=0; i<strlen(result); ++i)//这里会有一条警告,但是没关系
            //warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
            printf("%c", result[i]);
        printf("\n");
    }
return 0; }

今天也是元气满满的一天!good luck!

posted @ 2017-09-13 11:51  ikefire  阅读(137)  评论(0编辑  收藏  举报