Java 检查中的调试问题,老巫师崇拜之谜

Java 检查中的调试问题,老巫师崇拜之谜,java,arrays,loops,debugging,long-integer,Java,Arrays,Loops,Debugging,Long Integer,我试图用java解决这个谜题,关于一个老人,他活着是因为他的崇拜给了老人一些生命,这个特定的代码应该按照给定的规则工作,但是测试中的一个检查是错误的 public class hello { /** set true to enable debug */ static boolean debug = true; static long old(int n, int m, int k, int newp) { int max;

我试图用java解决这个谜题,关于一个老人,他活着是因为他的崇拜给了老人一些生命,这个特定的代码应该按照给定的规则工作,但是测试中的一个检查是错误的

public class hello {
    /** set true to enable debug */
    static boolean debug = true;

    static long old(int n, int m, int k, int newp) {
            int max;
            int min;
        boolean moreRows;

    if (m > n) {
        min = n;
        max = m;
        moreRows = true;
    } else {
        min = m;
        moreRows = false;
        max = n;
    }
    int sum = 0;
    int[][] ar2 = new int[(int)m][(int)n];
    // square part
    for (int i = 0; i < min; i++) {
        for (int j = 0; j < i; j++) {
           int t = i ^ j;
            ar2[i][j] = t - (t >= k ? k : 0);;
            sum += 2 * t- (t >= k ? k : 0);;
        }
    }
    for (int i = min; i < max; i++) {
        for (int j = 0; j < min; j++) {
            int t = i ^ j;
            sum += t;
            if (moreRows) {
                ar2[i][j] = t - (t >= k ? k : 0);
            } else {
                ar2[j][i] = t;
            }
        }
    }
        //retrun time
            while(newp<sum && newp>0) {
                sum=sum-newp;//wrap it up
            }
            return sum;
    }
  }

我得到了以下错误,看起来像一个长到int的错误-

./src/test/java/HelloTest.java:19: error: incompatible types: possible lossy conversion from long to int
        assertEquals(5456283, hello.old(28827050410L, 35165045587L, 7109602, 13719506));
                                                ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
更难的例子中还有一些错误-

        assertEquals(5456283, Hello.old(28827050410L, 35165045587L, 7109602, 13719506));
                                                ^
./src/test/java/HelloTest.java:39: error: incompatible types: possible lossy conversion from long to int
            long expected = Hello.old(m, n, l, t), actual = Hello.old(m, n, l, t);

调试其中一个assert equals和更难的示例中的一些错误,我真的不知道可以更改什么,我确信这是一个很小的错误,因此非常感谢您的帮助-注意:t永远不会大于2^32-1(根据问题说明)
谢谢

据我所知,数组的大小不能超过int,但如果不想更改long-everywhere,可以添加cast。

long m = 434;
    int[] obj = new int[(int) m];
试图通过与数组关联的迭代器访问超出允许的最大值可能会导致
OutOfMemoryException
IndexOutOfBoundsException
NoTouchElementException
之一,具体取决于实现


这是一种非常不切实际的内存使用。如果想要这样的数据结构,就应该研究RAM密集度较低的方法,如数据库、稀疏数组等。

据我所知,数组的大小不能超过int,但如果不想更改long-everywhere,则可以添加cast。

long m = 434;
    int[] obj = new int[(int) m];
试图通过与数组关联的迭代器访问超出允许的最大值可能会导致
OutOfMemoryException
IndexOutOfBoundsException
NoTouchElementException
之一,具体取决于实现

这是一种非常不切实际的内存使用。如果想要这样的数据结构,应该研究RAM密集度较低的方法,如数据库、稀疏阵列等

  • 最后一个测试不会在单个计算机上运行,因为
    long
    值不能用作数组长度和索引。这一点已在您的答复/评论中解释
  • 但是,可以从任务中扣除,您根本不需要在数组中存储中间数据,您应该只计算总数

    即使不使用数组,也很可能需要很长的时间来完成嵌套循环的
    28\u 827\u 050\u 410*35\u 165\u 045\u 587L/2
    迭代。如果你有一个处理器的性能为100gflop/s,它应该能够在160年内计算出来

  • t
    sum
    的计算不正确
  • 应该是:

    int t=i^j;
    如果(t>=k){
    t-=k;
    }
    总和+=2*t;//或第二部分中的sum+=t。
    
  • 最后一个循环似乎可以用simple
    返回和%newp替换

  • 更新:

    函数
    old
    可以进行如下重构(以去除数组),尽管它仍然是一个“幼稚”的解决方案,不会通过最后一次测试

    static int old(int n,int m,int k,int newp){
    int max;
    int-min;
    如果(m>n){
    min=n;
    max=m;
    }否则{
    min=m;
    max=n;
    }
    整数和=0;
    //方形部分
    对于(int i=0;i=k){
    t-=k;
    总和+=2*t;
    }            
    }
    }
    对于(int i=min;i=k){
    t-=k;
    总和+=t;
    }
    }
    }
    返回和%newp;
    }
    
    6个测试的输出:

    OK! 5
    OK! 224
    OK! 11925
    OK! 4323
    OK! 1586
    OK! 808451
    
  • 最后一个测试不会在单个计算机上运行,因为
    long
    值不能用作数组长度和索引。这一点已在您的答复/评论中解释
  • 但是,可以从任务中扣除,您根本不需要在数组中存储中间数据,您应该只计算总数

    即使不使用数组,也很可能需要很长的时间来完成嵌套循环的
    28\u 827\u 050\u 410*35\u 165\u 045\u 587L/2
    迭代。如果你有一个处理器的性能为100gflop/s,它应该能够在160年内计算出来

  • t
    sum
    的计算不正确
  • 应该是:

    int t=i^j;
    如果(t>=k){
    t-=k;
    }
    总和+=2*t;//或第二部分中的sum+=t。
    
  • 最后一个循环似乎可以用simple
    返回和%newp替换

  • 更新:

    函数
    old
    可以进行如下重构(以去除数组),尽管它仍然是一个“幼稚”的解决方案,不会通过最后一次测试

    static int old(int n,int m,int k,int newp){
    int max;
    int-min;
    如果(m>n){
    min=n;
    max=m;
    }否则{
    min=m;
    max=n;
    }
    整数和=0;
    //方形部分
    对于(int i=0;i=k){
    t-=k;
    总和+=2*t;
    }            
    }
    }
    对于(int i=min;i=k){
    t-=k;
    总和+=t;
    }
    }
    }
    返回和%newp;
    }
    
    6个测试的输出:

    OK! 5
    OK! 224
    OK! 11925
    OK! 4323
    OK! 1586
    OK! 808451
    

    “我想让它保持长时间的输入,因为有些测试的数字会超过整数”——那么你认为这些测试会如何工作呢?在Java中,不能创建包含超过2^31-1个元素的数组。(提示:如果测试要处理超出有效数组长度范围的数字,则可能不需要