N! hdu 1042
Posted ikefire
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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!
以上是关于N! hdu 1042的主要内容,如果未能解决你的问题,请参考以下文章