开始提问说错了一个问题,求.NET用阶乘求出1到30的阶乘,不能用平成的FOR循环因为数值较大。

2024-11-23 12:09:45
推荐回答(4个)
回答1:

用DOUBLE吧,这个用循环去乘,放到List里,是可行的

List里,这不就是集合吗?

结果如下:

回答2:

显然,你的老师让你给出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的阶乘就出来了。

回答3:

给一个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]);
}
}

回答4:

int private multiply(int m)
{
if(m==1)
{
return 1;
}
else
{
return m*multiply(m-1);
}
}

这是递归,虽然也是循环,不知道你说的用集合是怎么做,或者你讲具体一点