【问题标题】:Alternating factorial terms using Java使用 Java 交替阶乘项
【发布时间】:2014-04-08 08:45:53
【问题描述】:

我正在尝试用 Java 编写一个循环,它可以输出具有这种形式的系列的总和... 1! -3! + 5! – 7! + ... 最多 n (用户将 n 作为正奇数给出)。例如,如果用户为 n 输入 5,那么系列应该计算 1 的总和! -3! + 5! (困难部分)并使用基本打印语句(简单部分)向用户显示。如果用户给出 9,那么计算的总和将来自 1! -3! + 5! - 7! + 9!。

为方便起见,假设用户总是在任何时候输入一个正奇数。我现在只是担心尝试使用循环求和。

我想出的最接近的代码...

int counter = 1;
int prod = 1;   
n = console.nextInt(); 
while (counter <= n) 
{                  
    prod = prod * counter;
    counter++; 
}   
System.out.println(prod);

确实如此!,但我发现很难按照指定的方式完成它。任何指针都会很棒。

【问题讨论】:

  • 考虑创建一个计算阶乘的函数并使用该函数?
  • @devnull 从编程风格的角度来看,这是正确的做法。但是,这会显着增加运行时间。

标签: java loops series factorial


【解决方案1】:

在计算阶乘时,请保持该系列到目前为止的运行总计。每当counter % 4 == 1 时,将阶乘添加到运行总计中。无论何时counter % 4 == 3,从总和中减去阶乘。

您说“任何指针” - 我认为这意味着您希望我为您编写代码。

更新

这与您的原始代码密切相关,以便您尽可能容易理解。我已经更改了我需要更改的最低限度,以使其正常工作。

int counter = 1;
long prod = 1;   
long total = 0;

n = console.nextInt(); 

while (counter <= n) 
{                  
    prod = prod * counter;
    if( counter % 4 == 1 ) {
        total += prod;
    } else if (counter % 4 == 3) {
        total -= prod;
    }

    counter++; 
}   

System.out.println(total);

首先,请注意我已将prod 更改为long。那是因为阶乘变得非常大非常快。使用BigInteger 会更好,但我猜你还没有了解这些。

现在,其中有这两个条件,即何时将prod 添加到总数中,以及何时从总数中减去prod。当counter 除以 4 时,它们都通过检查余数来工作 - 换句话说,检查我们正在处理的阶乘,并相应地进行正确的操作。

【讨论】:

  • 原来指针是不够的。我昨天开始循环 & 尝试从循环中创建总和对我来说仍然非常困难。
  • 好的,给我几分钟,我会把它变成代码。还是您希望我花一些时间来说服您解决这个问题?
【解决方案2】:

首先需要引入一个变量int sum = 0;来存储交替序列的值。

要仅对每个第二个值求和,您应该跳过每个第二个值。您可以使用模运算检查,例如if( counter % 2 == 1 ).

如果是这样,您可以在总和中加上/减去 prod 的当前值。

要获得交替部分,您可以像这样使用boolean positive = true;

if( positive ) {
    sum += prod;
} else {
    sum -= prod;
}
positive = !positive;

基于boolean,增加或减少prod。之后会更改该值。

因为阶乘变得非常大非常快,最好使用long类型的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多