【发布时间】:2019-12-09 06:34:17
【问题描述】:
我会很快进入正题。基本上,史密斯数是: 合数,其数字之和是其素因数(不包括 1)的数字之和。 (素数被排除在外,因为它们很容易满足这个条件)。史密斯数的一个例子是野兽数 666=2·3·3·37,因为 6+6+6=2+3+3+(3+7)=18。
我尝试过的:
- 在 for 循环中,首先我得到当前数字的 (i) 位数的总和
- 在同一循环中,我尝试获取数字的素数位数的总和。
- 我已经做了另一种方法来检查将在 for 循环中处理的当前数字是否为素数,如果它的素数将被排除
但是我的代码似乎不起作用,你们能帮忙吗?
public static void main(String[] args) {
smithInrange(1, 50);
}
public static void smithInrange(int start_val, int end_val) {
for (int i = start_val; i < end_val; i++) {
if(!isPrime(i)) { //since we banned prime numbers from this process i don't include them
int for_digit_sum = i, digit = 0, digit_sum = 0, for_factor_purpose = i, smith_sum = 0;
int first = 0, second = 0, last = 0;
// System.out.println("current number is" + i);
while (for_digit_sum > 0) { // in this while loop i get the sum of current number's digits
digit = for_digit_sum % 10;
digit_sum += digit;
for_digit_sum /= 10;
}
// System.out.println("digit sum is"+digit_sum);
while (for_factor_purpose % 2 == 0) { // i divide the current number to 2 until it became an odd number
first += 2;
for_factor_purpose /= 2;
}
// System.out.println("the first sum is " + first);
for (int j = 3; j < Math.sqrt(for_factor_purpose); j += 2) {
while (for_factor_purpose % j == 0) { // this while loop is for getting the digit sum of every prime
// factor that j has
int inner_digit = 0, inner_temp = j, inner_digit_sum = 0;
while (inner_temp > 0) {
inner_digit = inner_temp % 10;
second += inner_digit;
inner_temp /= 10;
}
// System.out.println("the second sum is " + second);
for_factor_purpose /= j;
}
}
int last_temp = for_factor_purpose, last_digit = 0, last_digit_sum = 0;
if (for_factor_purpose > 2) {
while (last_temp > 0) {
last_digit = last_temp % 10;
last += last_digit;
last_temp /= 10;
}
// System.out.println("last is " + last);
}
smith_sum = first + second + last;
// System.out.println("smith num is "+ smith_sum);
// System.out.println(smith_sum);
if (smith_sum == digit_sum) {
System.out.println("the num founded is" + i);
}
}
}
}
public static boolean isPrime(int i) {
int sqrt = (int) Math.sqrt(i) + 1;
for (int k = 2; k < sqrt; k++) {
if (i % k == 0) {
// number is perfectly divisible - no prime
return false;
}
}
return true;
}
输出是: 成立的人数是4 成立的人数是9 成立的人数是22 成立的人数是25 成立的人数是27 成立的人数是49
这个范围(1 到 50)之间的史密斯数是: 4、22和27
编辑:我发现问题是: Math.sqrt(for_factor_purpose) 看来我应该给它加 1 来消除平方数。感谢你们,我从其他角度看到了解决方案。 继续编码!
【问题讨论】:
-
使用调试器并尝试查找
smithInrange(25, 26);(因为您已经知道 25 被错误地识别为 smith 数。)如果您这样做,您会发现您的算法用于查找 25 的质因数是错误的(提前终止)
标签: java