【问题标题】:Java Sigma Equation Solving sigma(i=1 to k)((-1)^i+1)(i)(i+1) Timedout for long valuesJava Sigma 方程求解 sigma(i=1 to k)((-1)^i+1)(i)(i+1) 长值超时
【发布时间】:2017-08-19 08:28:39
【问题描述】:

计算 sigma 表示法的值时出现超时错误 sigma(i=1 to k)((-1)^i+1)(i)(i+1) 对于非常长的值示例:10^8 .谁能指导我哪里做错了

import java.io.*;
import java.util.*;


public class TestClass {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter wr = new PrintWriter(System.out);
        int T = Integer.parseInt(br.readLine().trim());
        for(int t_i=0; t_i<T; t_i++)
        {
            int params1 = Integer.parseInt(br.readLine().trim());

            long out_ = maxValueX(params1);
            System.out.println(out_);
            System.out.println("");
         }

         wr.close();
         br.close();
    }
    static long maxValueX(long params1){
        long sum=0;
       for(long i=1;i<=params1;i++){
           sum=(long)Math.pow(-1,i+1)*i*(i+1)+sum;
       }
       return sum;

    }
}

【问题讨论】:

    标签: java induction


    【解决方案1】:

    诀窍是简化 sigma 表达式。如果params1 是偶数:

    1*2 - 2*3 + 3*4 - 4*5 + 5*6 - 6*7 + ... =
    (1*2 - 2*3) + (3*4 - 4*5) + (5*6 - 6*7) + ... =
    2*(1-3) + 4*(3-5) + 6*(5-7) + ... =
    -2*2 + -2*4 + -2*6 + ... =
    -2*2*(1 + 2 + 3 + ...)
    

    现在,括号中的术语有一个封闭式公式,因此您甚至不需要迭代计算它:https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF

    这种方法也适用于奇怪的params1,只是最后会有一个额外的术语需要说明。

    通过一些进一步的代数操作(留给读者作为练习),可以推导出一个适用于奇数和偶数参数的公式。在伪代码中(恰好是有效的 Python):

    def linear_time(n):
      return sum((-1)**(i+1)*i*(i+1) for i in range(1, n+1))
    
    def constant_time(n):
      return (-1)**n * (-n*n//2 - n)
    
    for n in (100, 101, 120, 100000, 1297981):
      print linear_time(n), constant_time(n)
    

    (取幂只是计算符号的一种惰性快捷方式;我们实际上不需要为此计算指数。)

    【讨论】:

    • 谢谢 :-) 会尝试一下不错的方法
    • 我有另一个小查询如果我需要在 simga 扩展中找到最大总和,我是否必须计算每个可能的值。
    • 对不起,我不太明白这个问题。我建议您将其发布在一个单独的问题中,并提供足够的详细信息以明确提出的问题。
    猜你喜欢
    • 2012-01-13
    • 2015-08-17
    • 2015-05-24
    • 2014-02-22
    • 1970-01-01
    • 2020-05-24
    • 2022-01-13
    • 2022-07-13
    • 1970-01-01
    相关资源
    最近更新 更多