用DOUBLE吧,这个用循环去乘,放到List
List
结果如下:
显然,你的老师让你给出1到30的阶乘的所有值(30个)而不是一个值,如有用递归或for的话,会造成资源浪费,因为1的阶乘要算30次,2的阶乘要算29次,解决的方法就是把这些结果保存起来。
long[] lngs = new long[30];
lngs[0] = 1;
for (int i = 1; i < 30; i++)
{
lngs[i] = lngs[i - 1] * (1+1);
}
这样1到30的阶乘就出来了。
给一个C的版本。.NET应该差得不大。
// TTTT.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define MAX_LEN 20 // 数组的长度
#define MAX_INT 10000 // 每个整数的最大值+1
#define MAX_INT_LEN "4" // 每个整数的位数
// *
void multiply(unsigned int a[MAX_LEN], unsigned n)
{
int more = 0;
for (int i = 0; i < MAX_LEN; i ++)
{
a[i] *= n;
}
// 进位
for (i = 0; i < MAX_LEN-1; i ++)
{
a[i+1] += a[i] / MAX_INT;
a[i] %= MAX_INT;
}
}
void main()
{
unsigned int a[MAX_LEN];
for (int i = 1; i < MAX_LEN; i ++)
{
a[i] = 0;
}
a[0] = 1;
unsigned int n;
scanf( "%u", &n );
for (i = 2; i <= (int)n; i ++)
{
multiply(a, i);
}
// 找到最大不是0的数字
for (i = MAX_LEN-1; i >= 0; i --)
{
if (a[i] > 0)
{
break;
}
}
// 打印第一个
printf("%u", a[i--]);
// 打印其余的,定长补0
for (int j = i; j >= 0; j --)
{
printf("%0" MAX_INT_LEN "u", a[j]);
}
}
int private multiply(int m)
{
if(m==1)
{
return 1;
}
else
{
return m*multiply(m-1);
}
}
这是递归,虽然也是循环,不知道你说的用集合是怎么做,或者你讲具体一点