首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

(笔试题)求n!解决思路

2012-01-06 
(笔试题)求n!rt(笔试题)求n![解决办法]int t 1for(int i2 in i++)t t * iSystem.out.println(t)

(笔试题)求n!

rt
(笔试题)求n!

[解决办法]
int t = 1;
for(int i=2; i<n; i++)
t = t * i;
System.out.println(t);

n如果过大就会溢出
[解决办法]

Java code
public long getNNNN(int n) {  long result = 1;  for (int i=n; i>0; i--) {     result = result * i;  }  return result;}
[解决办法]
Java code
public class Test {  public double getN(double n) {    if (n == 1)      return 1;    else      return (n * getN(n - 1));  }  public static void main(String[] args) {    double a = 10;    System.out.println(getN(a));  }}
[解决办法]
以下是递归实现:
分析如下;
n!=n*(n-1)!
(n-1)!=(n-1)*(n-2)!
....
0!=1
可以得出:
Java code
public static int func(int i) {        if (i == 0 || i == 1) {            return 1;        }        return i * func(--i);    }
[解决办法]
public long factorial(int num) {
long result = 1L;
while(num > 1) {
result *= num--;
}
return result;
}
[解决办法]
能不递归,就不递归,看来都知道要--啊... ...
[解决办法]
递归很方便:
public class Test{
public int getN(int n){
if(n==0 || n==1) return 1;
return n*getN(n-1);
}
public static void main(String[] args){
int result = new Test().getN(5);//例如N=5
System.out.println(result);
}
}
[解决办法]
n不能大于17,超过17int就溢出,需要先判断
if(n<0 && n>17)
{}
else
{}
超过17,用BigDecimal
[解决办法]
探讨
public long factorial(int num) {
long result = 1L;
while(num > 1) {
result *= num--;
}
return result;
}

[解决办法]
给出一段简单的Ruby代码,顺便搞定18!
a, n = 1, 18
(2..n).each{|i| a *= i}
p a
[解决办法]
呵呵,方法这么多
[解决办法]
真正的方法不是这么做的,需要用的数值方法中的一些公式,也是说用高等数学的里面的一些知识来求。

[解决办法]
4楼正解
[解决办法]
为什么没有一个人给出不限定n范围的解答?
结果溢出?溢出就没有结果了?程序就算不出来了?计算机的功能也太少点了吧……
一定要用int/long来存放最终结果?
没有人给出溢出后的解决方案
悲哀啊……那么多答案……
[解决办法]
如果只能求道18,还不如把结果都算出来,放数组里面呢!
[解决办法]
探讨
给出一段简单的Ruby代码,顺便搞定18!
a, n = 1, 18
(2..n).each{ ¦i ¦ a *= i}
p a

[解决办法]
看惯了java看ruby很别扭啊
[解决办法]
用递归是硬道理

Java code
public long getEstate(int num){  if (num <= 1)     return 1;  else      return num * getEstate(num - 1);} 


[解决办法]
很久以前,用c写过一个用数组存,求阶乘的方法。
可以支持到求5000的阶乘。不知对楼主有没有帮组;

#include "stdio.h"
#define N 250000 /*定义数组存储的最大位数*/
void main()
{int a[N],num,c,d,i,j;
while(1){
printf("请输入数字:");
scanf("%d",&num);
for(j=0;j<N;j=j+1){
a[j]=0;}/*数组内元素初始赋值为0*/

c=num;i=0;
while(c!=0){
d=c%10;
a[i]=d;
c=(c-d)/10;
i=i+1;}/*将要求阶乘的数逆序存储在数组中*/

for(i=num-1;i>1;i=i-1){
for(j=0;j<N;j=j+1){
a[j]=a[j]*i;}
for(j=0;j<N;j=j+1){
if(a[j]>=10){
a[j+1]=a[j+1]+a[j]/10;
a[j]=a[j]%10;}}
}/*计算阶乘*/
for(i=N-1;i>-1;i=i-1){
if(a[i]!=0)
break;}/*从数组尾端开始,找到第一个不为0的元素的位置*/
printf("该数字阶乘=");
for(j=i;j>-1;j=j-1){
printf("%d",a[j]);}
printf("\n");
printf("--------------------------------------------");
printf("\n");/*输出计算后的结果*/
}
}


热点排行