我正在尝试创建一个算法来找到GCD。我知道有更好的方法来解决这个问题,但是我陷入了这个问题:我使用了一个带Key = Divisor和Value = ArrayList的映射来进行除法。
我想为每个键创建一个新的ArrayList,但是我将继续填充相同的ArrayList。
Map<Integer,ArrayList<Integer>> map = new HashMap<Integer,ArrayList<Integer>>();
int[] arr = {9,27,63}; //input
ArrayList <Integer> v= new ArrayList<Integer>();
for (int i = 0; i < arr.length; i++) {
for (int div = 1 ; div < arr[i]; div++) {
map.put(div, v);
if ((arr[i] % div) == 0) {
v.add(arr[i]);
}
}
}
int result;
//print
for (Map.Entry<Integer,ArrayList<Integer>> entry:map.entrySet()) {
System.out.print("Key: "+(int)entry.getKey());
System.out.print("");
for(Integer in: entry.getValue()){
System.out.print("-> "+in + " ");
}
System.out.println();
//if size of ArrayList == arr input -> is a common divisor. The Greatest is the MCD
if (entry.getValue().size() == arr.length){
max = (int)entry.getKey();
}
}
System.out.println("Result: "+ result); //ERROR
}输出示例:
Key: 57-> 9 -> 9 -> 27 -> 27 -> 27 -> 63 -> 63 -> 63 -> 63 -> 63
Key: 58-> 9 -> 9 -> 27 -> 27 -> 27 -> 63 -> 63 -> 63 -> 63 -> 63
Key: 59-> 9 -> 9 -> 27 -> 27 -> 27 -> 63 -> 63 -> 63 -> 63 -> 63 很明显,57不能除以9,所以这个列表应该是清楚的。所以,每次我找到一个除数,我就把它放在同一个列表中。有人能帮我吗?
发布于 2021-05-14 07:14:01
您应该查看Java对象引用。
我只是浏览了一下你的代码,但是,我想你想要的是
for (int i = 0; i < arr.length; i++) {
for (int div = 1 ; div < arr[i]; div++) {
if ((arr[i] % div) == 0) {
if (!map.containsKey(div)) {
map.put(div, new ArrayList<>());
}
map.get(div).add(arr[i]);
}
}
}发布于 2021-05-14 07:53:03
根据你的需要,我认为这是你想要的。在循环中,总是循环到数/2,作为其因子,因为a 数没有大于其一半的任何因子。
Map<Integer,ArrayList<Integer>> map = new HashMap<Integer,ArrayList<Integer>>();
int[] arr = {9,27,63}; //input
for (int i = 0; i < arr.length; i++) {
int number = arr[i];
for (int div = 1 ; div <= number/2 ; div++) {
ArrayList <Integer> v= new ArrayList<>();
if ((number % div) == 0) {
if(!map.containsKey(div))
map.put(div, v);
map.get(div).add(number);
}
}
}输出:
Key: 1-> 9 -> 27 -> 63
Key: 3-> 9 -> 27 -> 63
Key: 21-> 63
Key: 7-> 63
Key: 9-> 27 -> 63 根据您的需要,请告诉我是否正确。
https://stackoverflow.com/questions/67530278
复制相似问题