## Thursday, 10 November 2016

### Chapter 11 Exercise 17, Introduction to Java Programming, Tenth Edition Y. Daniel LiangY.

11.17  (Algebra: perfect square) Write a program that prompts the user to enter an integer m
and find the smallest integer n such that m  n is a perfect square.
(Hint: Store all smallest factors of m into an array list. n is the product of the factors that
appear an odd number of times in the array list. For example, consider m = 90,
store the factors 2, 3, 3, 5 in an array list. 2 and 5 appear an odd number of times
in the array list. So, n is 10.)

import java.util.ArrayList;
import java.util.Scanner;

public class Exercise_17 {

public static void main(String[] args) {
System.out.print("Enter an integer m: ");
Scanner input = new Scanner(System.in);
int m = input.nextInt();
ArrayList<Integer> factors = new ArrayList<>();

getFactors(m, factors);

int smallestSquare = smallestSquare(factors);
System.out.println("The smallest number n for m * n to be a perfect square is " + smallestSquare);
System.out.println("m * n = " + (m * smallestSquare));
}

private static int smallestSquare(ArrayList<Integer> factors) {

int[][] occurrences = copy(factors);
for (int i : factors) {
search(occurrences, i);
}

// remove duplicates and get odd sequence factors
ArrayList<Integer> oddSequenceFactors = removeDuplicates(occurrences);

// get smallest square by multiplying oddSequenceFactors
int smallestSquare = 1;
for (int i : oddSequenceFactors) {
smallestSquare *= i;
}
return smallestSquare;
}

private static ArrayList<Integer> removeDuplicates(int[][] m) {
ArrayList<Integer> temp = new ArrayList<>();

for (int i = 0; i < m.length; i++) {
if (m[i][1] % 2 != 0) {
}
}

// removing duplicates
ArrayList<Integer> duplicateRemoved = new ArrayList<>();
for (int i = 0; i < temp.size(); i++) {

if (!duplicateRemoved.contains(temp.get(i))) {
}
}

return duplicateRemoved;
}

private static void search(int[][] m, int number) {
for (int i = 0; i < m.length; i++) {
if (m[i][0] == number) {
m[i][1]++;
}
}
}

private static int[][] copy(ArrayList<Integer> factors) {

int[][] temp = new int[factors.size()][2];

for (int i = 0; i < temp.length; i++) {
temp[i][0] = factors.get(i);
}
return temp;
}

private static void getFactors(int m, ArrayList<Integer> factors) {

int count = 2;
while (count <= m) {
if (m % count == 0) {