static boolean isPrime(int n)
{
if(n<=1) return false;
if(n==2) return true;
if(n%2==0) return false;
int m = (int)Math.round(Math.sqrt(n));
for(int i=3; i <= m; i+=2)
if(n%i==0)
return false;
return true;
}
static boolean isHumble(int n)
{
for(int i = 2; i <= n; i++)
{
if (isPrime(i) && isFactor(n, i))
{
System.out.println(i);
//if(isPresent(i))
// return false;
//else return true;
return true;
}
}
return false;
}
static boolean isFactor(int val1, int val2)
{
return val1%val2==0;
}
static boolean isPresent(int n){
for(int val : prime_factors)
if(n==val)
return true;
return false;
}
// prime_factors {2,3,5,7}
我正在实现一个isHumble函数,但由于某些原因,某些东西似乎已经关闭了。有人可以帮帮我吗?
答案 0 :(得分:3)
修改强>
在素数列表中添加1,然后尝试以下操作:
boolean isHumble(int n)
{
if (isFactor(n)) return true;
for(int i=2;i<=n/2;i++)
{
while(n%i == 0)
if (isFactor(i))
n /= i;
else
return false;
}
return isFactor(n);
}
这样就可以从数字中删除这些因素,而不会在以后找到。
修改2
更简单的解决方案是:
boolean isHumble(int n)
{
for (int val : prime_factors)
while (n % val == 0) n /= val;
return (n == 1);
}
答案 1 :(得分:0)
由于编写isHumble
方法的方式,因此编写的isFactor
方法会为每个数字返回false ...
答案 2 :(得分:0)
一个不起眼的数字是唯一的素数因子是2,3,5,7。这意味着,如果你把所有“素数”从0到n / 2,只有2,3,5,7应该除以它们。 相反,你将从0到n / 2的所有数字,并检查它们是否是因素。
因此,在你的情况下,当i = 9时,声明 if(n%i == 0)返回true,因此返回false正在执行。
在i上运行你的外循环只有素数而不是从0到n / 2的所有数字,你应该没事。
答案 3 :(得分:0)
您的isFactor
方法可以更容易编写为
boolean isFactor(int n){
return prime_factors.contains(n);
}