Java 检查中的调试问题,老巫师崇拜之谜
我试图用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;
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。
返回和%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。
返回和%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个元素的数组。(提示:如果测试要处理超出有效数组长度范围的数字,则可能不需要