以下两端代码有什么不一样???(杭电2010)

Seana-Preta 2020-04-15 02:36:28
以下两端代码都是针对杭电2010的解决方案,但是第一段提交后可以通过,第二段则不行。
题目:
水仙花数
第一段:

import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i, j, n, m, a, b, c;
while (sc.hasNextInt()) {
m = sc.nextInt();
n = sc.nextInt();
for (i = m, j = 0; i <= n; i++) {
a = i / 100;
b = i / 10 % 10;
c = i % 10;
if (a * a * a + b * b * b + c * c * c == i) {
if (j > 0) {
System.out.print(" " + i);
} else {
System.out.print(i);
}
j++;
}
}
if (j == 0) {
System.out.print("no");
}
System.out.println();
}

}
}



第二段:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int start, end;
int[] results = new int[10];
while (sc.hasNext()) {
start = sc.nextInt();
end = sc.nextInt();
int counter = 0;
for (int i = start; i < end + 1; i++) {
if(isSpecial(i)) {
// 将结果先放在数组中,方便控制输出和换行
results[counter] = i;
counter++;
}
}
if(results[0] == 0) {
System.out.println("no");
} else {
for (int i = 0; i < counter; i++) {
if(i == 0) {
System.out.print(results[i]);
} else {
System.out.print(" "+results[i]);
}
/*if(i == counter-1) {
// 最后一个结果换行
System.out.println(results[i]);
} else {
System.out.print(results[i]+" ");
}*/
}
System.out.println();
}
}
}

private static boolean isSpecial(int n) {
int a, b, c;
// 个位
a = n%10;
// 十位
b = (n/10)%10;
// 百位
c = (n/100);
return (a*a*a + b*b*b + c*c*c) == n;
}
}

...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seana-Preta 2020-04-15
  • 打赏
  • 举报
回复
引用 5 楼 qybao 的回复:
[quote=引用 3 楼 Seana-Preta 的回复:] 感谢你的回答,好像确实是要写成if(counter==0)。修改后杭电OJ测试通过了。 但是我还有点不明白,results数组用来存放水仙花数,但凡找到一个水仙花数肯定是先放在数组的第0个位置,所以如果连第零个位置的值都是0的话(java声明的数组值默认都是0),那就说明该数组没有被覆盖过,就没有水仙花数,所以我才写成if(results[0] == 0),关于这一点还请指教。 对于start和end之间相差10,因为我知道该题的结果(100~999之间的水仙花数只有四个),为了省事儿我就直接写成10,肉眼可见的程序输出是对的但是在OJ上执行不通过。
很简单啊,你试试看start=i=0的时候,你的results[counter] = i;会不会是0?因为你的程序里并没有判断是否是3位数[/quote] 谢谢你的提醒,但是其实是本题的约定了只会输入三位数,范围是100~999 题目链接
Seana-Preta 2020-04-15
  • 打赏
  • 举报
回复
引用 7 楼 qq_39936465 的回复:
你自己可以测试一下,输入2组数字 第一次输入100和999 第2次输入100和500 结果是一样的,所以你的程序有问题。

100
999
153 370 371 407
100
500
153 370 371 407
[/code]
感谢你的回答。但其实是100到999之间只有四个水仙花数153 370 371 407,都在500之下,所以你使用的两组数100~999和100~500结果是一样的。程序应该不是在这里出的错。
Seana-Preta 2020-04-15
  • 打赏
  • 举报
回复
引用 6 楼 qq_39936465 的回复:
[quote=引用 3 楼 Seana-Preta 的回复:] 好像确实是要写成if(counter==0)。修改后杭电OJ测试通过了。 但是我还有点不明白,results数组用来存放水仙花数,但凡找到一个水仙花数肯定是先放在数组的第0个位置,所以如果连第零个位置的值都是0的话(java声明的数组值默认都是0),那就说明该数组没有被覆盖过,就没有水仙花数,所以我才写成if(results[0] == 0),关于这一点还请指教。 对于start和end之间相差10,因为我知道该题的结果(100~999之间的水仙花数只有四个),为了省事儿我就直接写成10,肉眼可见的程序输出是对的但是在OJ上执行不通过。
因为你的程序是反复循环的,但是第1次循环后该数组并没有清空,第2次循环时会有问题。[/quote] 明白了感谢 如果第一组数据范围内有水仙花数,数组被赋值;但是如果下一组没有水仙花数的话,数组就没有被再覆盖,还是上一组的结果,但是counter为0,导致for循环无法输出,致此时程序无法向下执行。
qq_39936465 2020-04-15
  • 打赏
  • 举报
回复
count==0只能解决部分问题,但是并不完全正确,还要把数组初始化移动到while循环内
qq_39936465 2020-04-15
  • 打赏
  • 举报
回复
你自己可以测试一下,输入2组数字 第一次输入100和999 第2次输入100和500 结果是一样的,所以你的程序有问题。

100
999
153 370 371 407
100
500
153 370 371 407
[/code]
qq_39936465 2020-04-15
  • 打赏
  • 举报
回复
引用 3 楼 Seana-Preta 的回复:
好像确实是要写成if(counter==0)。修改后杭电OJ测试通过了。 但是我还有点不明白,results数组用来存放水仙花数,但凡找到一个水仙花数肯定是先放在数组的第0个位置,所以如果连第零个位置的值都是0的话(java声明的数组值默认都是0),那就说明该数组没有被覆盖过,就没有水仙花数,所以我才写成if(results[0] == 0),关于这一点还请指教。 对于start和end之间相差10,因为我知道该题的结果(100~999之间的水仙花数只有四个),为了省事儿我就直接写成10,肉眼可见的程序输出是对的但是在OJ上执行不通过。
因为你的程序是反复循环的,但是第1次循环后该数组并没有清空,第2次循环时会有问题。
qybao 2020-04-15
  • 打赏
  • 举报
回复
引用 3 楼 Seana-Preta 的回复:
感谢你的回答,好像确实是要写成if(counter==0)。修改后杭电OJ测试通过了。
但是我还有点不明白,results数组用来存放水仙花数,但凡找到一个水仙花数肯定是先放在数组的第0个位置,所以如果连第零个位置的值都是0的话(java声明的数组值默认都是0),那就说明该数组没有被覆盖过,就没有水仙花数,所以我才写成if(results[0] == 0),关于这一点还请指教。

对于start和end之间相差10,因为我知道该题的结果(100~999之间的水仙花数只有四个),为了省事儿我就直接写成10,肉眼可见的程序输出是对的但是在OJ上执行不通过。

很简单啊,你试试看start=i=0的时候,你的results[counter] = i;会不会是0?因为你的程序里并没有判断是否是3位数
Seana-Preta 2020-04-15
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465 的回复:
[quote=引用 楼主 Seana-Preta 的回复:] 以下两端代码都是针对杭电2010的解决方案,但是第一段提交后可以通过,第二段则不行。 题目:
第2段 while (sc.hasNext())这里有问题吧,输入数字以外会出错。[/quote] 谢谢你的提醒,不过这个练习题中约定了输入只有整数,不需要担心非法输入的情况。 我在提问中附有题目的连接,你可以看看。
Seana-Preta 2020-04-15
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
第二段代码的if(results[0] == 0) {有问题,应该是if(counter==0),(results[0] == 0只能保证第一个数不是水仙花数,并不能保证后面不出现水仙花数 另外,你的start和end之间只相差10吗?如果大于10,你的int[] results = new int[10];将会发生数组越界
感谢你的回答,好像确实是要写成if(counter==0)。修改后杭电OJ测试通过了。 但是我还有点不明白,results数组用来存放水仙花数,但凡找到一个水仙花数肯定是先放在数组的第0个位置,所以如果连第零个位置的值都是0的话(java声明的数组值默认都是0),那就说明该数组没有被覆盖过,就没有水仙花数,所以我才写成if(results[0] == 0),关于这一点还请指教。 对于start和end之间相差10,因为我知道该题的结果(100~999之间的水仙花数只有四个),为了省事儿我就直接写成10,肉眼可见的程序输出是对的但是在OJ上执行不通过。
qq_39936465 2020-04-15
  • 打赏
  • 举报
回复
引用 楼主 Seana-Preta 的回复:
以下两端代码都是针对杭电2010的解决方案,但是第一段提交后可以通过,第二段则不行。 题目:
第2段 while (sc.hasNext())这里有问题吧,输入数字以外会出错。
qybao 2020-04-15
  • 打赏
  • 举报
回复
第二段代码的if(results[0] == 0) {有问题,应该是if(counter==0),(results[0] == 0只能保证第一个数不是水仙花数,并不能保证后面不出现水仙花数
另外,你的start和end之间只相差10吗?如果大于10,你的int[] results = new int[10];将会发生数组越界

50,613

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧