我得到了一个创建程序的任务,该程序显示1到100之间的完美整数。这是实际的任务:
创建一个PerfectIntegers应用程序,显示所有完美的整数,最多100个。完整整数是一个数字,它等于除了它自身之外的所有因子的总和。例如,6是一个完美的数字,因为1 + 2 + 3 = 6.应用程序应该包含一个布尔方法isPerfect()。
我试过并想出了这个:
import java.util.ArrayList;
public class PerfectIntegers {
public static boolean isPerfect(int a){
ArrayList<Integer> factors = new ArrayList<Integer>();
int sum=0;
boolean is;
for (int i=1; i<=100; i++){
double r=a/i;
if (r%1==0){
factors.add(i);
}
}for (int i=0;i<factors.size();i++){
sum+=factors.get(i);
}if (sum==a){
is=true;
}else{
is=false;
}return is;
}
public static void getInts(){
for (int i=2; i<=100; i++){
boolean is=isPerfect(i);
if (is!=false){
System.out.print(i+" ");
}
}
}
public static void main(String[] args) {
getInts();
}
}
Eclipse没有显示任何错误,但是当我尝试运行它时,程序终止,我什么都没得到。
问题可能发生在double r
,因为它没有在100%的时间内正确分割。
答案 0 :(得分:4)
您的分解代码错误。你可以像这样解决它:
for (int i = 1 ; i < a; i++) {
if (a % i == 0) {
factors.add(i);
}
}
旧代码不起作用的一个原因是您误解了%
运算符的工作原理。它计算右侧的左侧除法的余数,因此r % 1 == 0
对于所有数字都是true
,因为1
除了所有数字; r % 2 == 0
是一种检测偶数的方法,等等。
另一个原因是你一直到100寻找除数。这必须包含a
,这会自动将总数高于数字本身,因为1
已经在列表中。
一旦你开始工作,你可以通过删除因子列表来简化代码。既然所有因素的总和都是你需要的,你也可以在分解循环中计算它,并删除它后面的循环:
sum = 0;
for (int i = 1 ; i < a; i++) {
if (a % i == 0) {
sum += i;
}
}
答案 1 :(得分:0)
dasblinkenlight 已经提供了正确的答案。我要补充一点,因为这似乎是一个(可能是分级的)赋值,您可以考虑重构getInts()
方法。
boolean is=isPerfect(i);
if (is!=false){
System.out.print(i+" ");
}
实际上等于
if (isPerfect(i)){
System.out.print(i+" ");
}
因为isPerfect()已经返回一个可以在if语句的条件内使用的布尔值。 可以说(尽管我在这个具体案例中强烈反对),首先将返回值存储在第一个变体中的变量中可能更具可读性。但即便如此,你也不应该检查
if (is!=false) { //...
但应该使用
if (is) { // ...
代替。