java - 1 - 10000 Java 之间友好数的递归方法
问题描述
我在创建用于查找 1 - 10000 之间的 Amicable 数字的递归方法时遇到问题。我创建了一个方法来确定两个数字是否是 Amicable,但我不知道如何针对每个可能的数字组合运行它。这是我写的两种方法。
public void amicable(int n, int m) {
int sumM = 0;
int sumN = 0;
for (int i = 1; i < n; i++) {
if (n % i == 0) {
sumN += i;
}
}
for (int j = 1; j < m; j++) {
if (m % j == 0) {
sumM += j;
}
}
if (sumN == m && sumM == n) {
System.out.println(n + " and " + m + " are amicable numbers");
}
}
public static void amicableBetween(int n, int m) {
int sumaM = 0;
int sumaN = 0;
if (m >= 1) {
for (int j = 1; j < m; j++) {
if (m % j == 0) {
sumaM += j;
}
}
for (int i = 1; i < n; i++) {
if (n % i == 0) {
sumaN += i;
}
}
if (sumaN == m && sumaM == n) {
System.out.println(n + " and " + m + " are amicable numbers");
amicableBetween(n + 1, m - 1);
} else {
System.out.println(n + " i " + m + " aren't amicable numbers");
amicableBetween(n + 1, m - 1);
}
}
}
}
解决方案
次要免责声明,这种方法可能需要很长时间,而且您可能会用完堆栈空间,所以我不能 100% 确定递归地计算 1-10000 的所有友好数字是要走的路。如果这只是为了好玩或练习,那么我想没问题。
一种方法是扫描n
,直到我们到达m - 1
并调用amicable(n,m)
每一步。一旦n
达到m - 1
,我们可以减少m
并1
重复该过程,直到n is equal to m - 1
我们检查了所有可能的组合。为此,您可以将两种方法分解为三种方法。
第一个方法是amicable
您已经拥有的方法,只是更改了返回类型,以便我们可以在沿着递归链下行时重用它:
public static boolean amicable(int n, int m) {
int sumM = 0;
int sumN = 0;
for (int i = 1; i < n; i++) {
if (n % i == 0) {
sumN += i;
}
}
for (int j = 1; j < m; j++) {
if (m % j == 0) {
sumM += j;
}
}
return sumN == m && sumM == n;
}
第二个是public
方法amicableBetween(int n, int m)
public static void amicableBetween(int n, int m) {
amicableBetween(n, m, true);
}
它将调用第三个private
辅助方法amicableBetween(int n, int m, boolean start)
,该方法具有第三个参数start
,可用于识别是否n
已达到m
。然后我们需要减少m
并1
重复这个过程:
private static void amicableBetween(int n, int m, boolean start) {
if(n == m) {
return;
}
if (m >= 1) {
if (amicable(n, m)) {
System.out.println(n + " and " + m + " are amicable numbers");
} else {
System.out.println(n + " and " + m + " aren't amicable numbers");
}
amicableBetween(n + 1, m, false);
}
if(start) {
amicableBetween(n, m - 1, true);
}
}
推荐阅读
- sharepoint - Sharepoint 2016 本地详细信息项目版本字段信息
- php - 如何在 Laravel 中存储多选值
- node.js - 填充单个嵌入文档
- angular - Angular 6 - HTTP Post 上未添加标头
- javascript - html 5画布未显示在iOS移动Safari上
- ckeditor - CKEditor 5 保存选定的文本并在恢复内容后再次将其设置为选定
- angular - 角内化翻译文件上传按钮文本
- python - Python2将exec从不合格转换为合格
- load-testing - 负载测试的断点
- powershell - 是否有任何解决方法可以在没有管理员用户权限的情况下执行文件签名?