Java程序,用于查找10000以下的友好对,并以2列矩阵形式输出
我正试图弄明白这一点。如何编写一个java程序,在某个值(即10000)下找到友好对,因此它必须比较从0到该限制的所有数字,并找出哪些是友好对。然后我必须将输出作为2列矩阵 我整理出计算一个数的适当因子的公式,然后求和 但是我不能进一步使用for循环,它将把数字比较在一起,而最终的输出将给出一个2列矩阵的结果 到目前为止,我是通过因子或除数的总和,这就是我所拥有的Java程序,用于查找10000以下的友好对,并以2列矩阵形式输出,java,arrays,for-loop,matrix,2d,Java,Arrays,For Loop,Matrix,2d,我正试图弄明白这一点。如何编写一个java程序,在某个值(即10000)下找到友好对,因此它必须比较从0到该限制的所有数字,并找出哪些是友好对。然后我必须将输出作为2列矩阵 我整理出计算一个数的适当因子的公式,然后求和 但是我不能进一步使用for循环,它将把数字比较在一起,而最终的输出将给出一个2列矩阵的结果 到目前为止,我是通过因子或除数的总和,这就是我所拥有的 public class Amicable { public static int sumfactors(int n) {
public class Amicable {
public static int sumfactors(int n) {
int sum=0;
for(int div=1; div<=n; div++)
{
if(n%div==0)
{
sum +=div;
}
}
return sum-n;
}
}
公共类友好{
公共静态整数因子(整数n){
整数和=0;
对于(int div=1;div首先,您可以改进方法的性能:
private static int sumFactors(int n)
{
int sum = 0;
for (int div=1; div<=n/2; div++)
{
if (n%div == 0)
{
sum += div;
}
}
return sum;
}
private static int sumFactors(int n)
{
整数和=0;
对于(int div=1;div我在下面提供了一个解决方案,该解决方案将找到友好数,直到一个极限,并返回为2D数组
public static int[][] findAmicableNumbers(int N) {
int checked = 0;
Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
for (int i = 1; i <= N; i++) {
int u = sumOfDivisors(i);
if (i == u) {
continue;
}
int v = sumOfDivisors(u);
if (i != checked && i == v) {
checked = u;
map.put(i, u);
}
}
int[][] result = new int[map.size()][2];
int index = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
result[index][0] = entry.getKey();
result[index][1] = entry.getValue();
index++;
}
return result;
}
public static int sumOfDivisors(int N) {
int sum = 1;
for (int i = 2; i * i <= N; i++) {
if (N % i == 0) {
sum += i;
if (N / i != i) {
sum += N / i;
}
}
}
return sum;
}
public static void main(String[] args) {
int[][] res = findAmicableNumbers(10000);
for (int[] a : res) {
System.out.println(Arrays.toString(a));
}
}
这是一个应该有效的简单解决方案
public static long ambicable(long c) {
int res=0;
for(long i=1;i<c;i++){
if(c%i==0) {
res+=i;
}
}
return res;
}
public static long pair(long a) {
long c=0;
for(long i=1;i<10000;i++) {
if(i==ambicable(ambicable(i))&& i!=ambicable(i)) {
c+=i;
}
}
return c;
}
公共静态长双绞线(长c){
int res=0;
对于(long i=1;我希望你能给出一个快速的答案,不幸的是,由于我在java方面的经验很少,我在这里仍然感到困扰,我希望能有一个更详细的解释(int div=1;div@user3575825:您应该将您的代码作为问题的一部分发布。@user3575825:答案也相应更新,但我觉得您需要做一点Java学习……这是肯定的!感谢您的帮助!还有一件事,最后的2d矩阵,必须使用Map Hashmap完成,或者是否有任何不使用图书馆的其他方式?
public static int[][] findAmicableNumbers(int N) {
int checked = 0;
Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
for (int i = 1; i <= N; i++) {
int u = sumOfDivisors(i);
if (i == u) {
continue;
}
int v = sumOfDivisors(u);
if (i != checked && i == v) {
checked = u;
map.put(i, u);
}
}
int[][] result = new int[map.size()][2];
int index = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
result[index][0] = entry.getKey();
result[index][1] = entry.getValue();
index++;
}
return result;
}
public static int sumOfDivisors(int N) {
int sum = 1;
for (int i = 2; i * i <= N; i++) {
if (N % i == 0) {
sum += i;
if (N / i != i) {
sum += N / i;
}
}
}
return sum;
}
public static void main(String[] args) {
int[][] res = findAmicableNumbers(10000);
for (int[] a : res) {
System.out.println(Arrays.toString(a));
}
}
[220, 284]
[1184, 1210]
[2620, 2924]
[5020, 5564]
[6232, 6368]
public static long ambicable(long c) {
int res=0;
for(long i=1;i<c;i++){
if(c%i==0) {
res+=i;
}
}
return res;
}
public static long pair(long a) {
long c=0;
for(long i=1;i<10000;i++) {
if(i==ambicable(ambicable(i))&& i!=ambicable(i)) {
c+=i;
}
}
return c;
}