系列代
Series generation
我正在尝试找出级数的总和,1/2! - 2/3! + 3/4! - 4/5! ... 名词。抱歉,这听起来很尴尬,但总和始终显示为 0.0。我不知道发生了什么,我才刚刚开始。任何人都可以指出错误并建议如何解决吗?谢谢!
import java.util.Scanner;
public class Series {
/*
* Series design: 1/2! - 2/3! + 3/4! - 4/5! .. n
*/
static double sum = 0; static int n;
Scanner sc = new Scanner(System.in);
public static int fact(int n){
int fact = 1;
for (int i = 1; i<=n; i++){
fact *= i;
}
return fact;
}
void generate(){
double sign = 1.0; double term;
for (int i = 1; i<=n; i++){
term = i/fact(i+1) * sign;
sum += term;
sign *= -1;
}
}
void accept(){
System.out.println("Enter the value of n:");
n = sc.nextInt();
}
public static void main(String[] args){
Series o = new Series();
o.accept();
o.generate();
System.out.println("The sum of the series is: " +sum);
}
}
你的问题是 i/fact(i+1)
是一个 int
分区,所以它被截断为 0(因为它小于 1)。
改为(double)i/fact(i+1)
。
或者,您可以写
term = sign*i/fact(i+1);
因为 sign
已经是双倍的,所以它会确保 sign*i
也是双倍的,除法将是浮点除法。
i
和 fact(i+1)
都是 int
,因此您正在执行 integer division。由于 i < fact(i+1)
,每个这样的术语都会产生一个零。
您将 sign
定义为 double
的想法是正确的,但由于 /
和 *
具有相同的优先级,因此您首先执行整数除法,然后乘以双 sign
。将它移到表达式的开头应该可以解决问题:
void generate(){
double sign = 1.0; double term;
for (int i = 1; i<=n; i++){
term = (sign * i) / fact(i+1);
sum += term;
sign *= -1;
}
}
import java.util.Scanner;
public class Series {
static double sum = 0.0;
static int n=0;
static Scanner sc = new Scanner(System.in);
public static int fact(int n)
{
int fact = 1;
for(int i = 1; i<=n; i++){
fact *= i;
}
return fact;
}
static void generate(){
//because of static property
double sign = 1.0; double term;
for(int i = 1; i<=n; i++){
term = (i* sign)/fact(i+1) ;
sum += term;
sign *= -1;
}
}
static void accept(){
//because of static property
System.out.println("Enter the value of n:");
n = sc.nextInt();
}
public static void main(String[] args){
Series.accept();
Series.generate();
System.out.println("The sum of the series is: " +sum);
}
}
我正在尝试找出级数的总和,1/2! - 2/3! + 3/4! - 4/5! ... 名词。抱歉,这听起来很尴尬,但总和始终显示为 0.0。我不知道发生了什么,我才刚刚开始。任何人都可以指出错误并建议如何解决吗?谢谢!
import java.util.Scanner;
public class Series {
/*
* Series design: 1/2! - 2/3! + 3/4! - 4/5! .. n
*/
static double sum = 0; static int n;
Scanner sc = new Scanner(System.in);
public static int fact(int n){
int fact = 1;
for (int i = 1; i<=n; i++){
fact *= i;
}
return fact;
}
void generate(){
double sign = 1.0; double term;
for (int i = 1; i<=n; i++){
term = i/fact(i+1) * sign;
sum += term;
sign *= -1;
}
}
void accept(){
System.out.println("Enter the value of n:");
n = sc.nextInt();
}
public static void main(String[] args){
Series o = new Series();
o.accept();
o.generate();
System.out.println("The sum of the series is: " +sum);
}
}
你的问题是 i/fact(i+1)
是一个 int
分区,所以它被截断为 0(因为它小于 1)。
改为(double)i/fact(i+1)
。
或者,您可以写
term = sign*i/fact(i+1);
因为 sign
已经是双倍的,所以它会确保 sign*i
也是双倍的,除法将是浮点除法。
i
和 fact(i+1)
都是 int
,因此您正在执行 integer division。由于 i < fact(i+1)
,每个这样的术语都会产生一个零。
您将 sign
定义为 double
的想法是正确的,但由于 /
和 *
具有相同的优先级,因此您首先执行整数除法,然后乘以双 sign
。将它移到表达式的开头应该可以解决问题:
void generate(){
double sign = 1.0; double term;
for (int i = 1; i<=n; i++){
term = (sign * i) / fact(i+1);
sum += term;
sign *= -1;
}
}
import java.util.Scanner;
public class Series {
static double sum = 0.0;
static int n=0;
static Scanner sc = new Scanner(System.in);
public static int fact(int n)
{
int fact = 1;
for(int i = 1; i<=n; i++){
fact *= i;
}
return fact;
}
static void generate(){
//because of static property
double sign = 1.0; double term;
for(int i = 1; i<=n; i++){
term = (i* sign)/fact(i+1) ;
sum += term;
sign *= -1;
}
}
static void accept(){
//because of static property
System.out.println("Enter the value of n:");
n = sc.nextInt();
}
public static void main(String[] args){
Series.accept();
Series.generate();
System.out.println("The sum of the series is: " +sum);
}
}