[JAVA] À propos de la méthode de division continue apprise en 4e année du primaire

Il a une balise mathématique, mais c'est de l'arithmétique.

Méthode de division continue

En 4e année du primaire, j'ai appris les multiples communs maximum et minimum, mais j'ai appris qu'il existe une méthode de division continue (les deux calculs suda) dans le «comment faire» à ce moment-là.

Comment faire

20170124_001.png

Engagement maximum (GCD)

S'il y a une fraction commune dans l'ensemble des entiers, réduisez-la et multipliez tous les diviseurs pour la trouver.

Multiple commun minimum (LCM)

S'il y a deux fractions communes ou plus dans un ensemble d'entiers, réduisez-les, puis multipliez le diviseur et le reste pour le trouver.

GCD commun, LCM

Bien sûr, vous pouvez facilement le faire avec la division mutuelle euclidienne. Même s'il y a plus de deux paires d'entiers, cela peut être résolu par $ gcd (a, b, c) = gcd (gcd (a, b), c) $.

public int gcd(int a, int b) {
   if (b == 0) return a;
   return gcd(b, a % b);
}

public int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

Essayez de réimplémenter

Cependant, comme le but est d'être reproductible dans Scratch, je vais essayer de l'assembler en Java pour le moment. Source

Étant donné que la méthode de passation de marchés est différente entre GCD et LCM, Predicate est remplacé. Vous pouvez également transmettre des fonctions en Java!

Integer primeFactory(List<Integer> intList) {
	Predicate<Integer> op = mode.equals(Mode.GCD) ? factoryAll(intList) : factoryMulti(intList);
	return primeList.stream().filter(op).findFirst().orElse(1);
}

static Predicate<Integer> factoryAll(List<Integer> intList) {
	return i -> intList.stream().allMatch(isDivisable(i));
}

static Predicate<Integer> factoryMulti(List<Integer> intList) {
	return i -> intList.stream().filter(isDivisable(i)).count() > 1;
}

――Si vous pouvez conclure un contrat, passez à l'étape suivante

Générez un nouvel ensemble d'entiers en divisant l'ensemble d'origine d'entiers par une fraction. Vous passez une opération à un seul terme dans UnaryOperator. S'il n'est pas divisible en raison de LCM, l'entier d'origine est renvoyé.

static List<Integer> divideList(Integer divisor, List<Integer> intList) {
	return intList.stream().map(divide(divisor)).collect(Collectors.toList());
}

static UnaryOperator<Integer> divide(Integer divisor) {
	return i -> (i % divisor) == 0 ? i / divisor : i;
}
Integer getGCD() {
	return reduceDivisor();
}
Integer getLCM() {
	return getLastValue().stream().reduce(1, (x, y) -> x * y) * reduceDivisor();
}
Integer reduceDivisor() {
	return stack.stream().map(p -> p.getKey()).reduce(1, (x, y) -> x * y);
}

Épilogue

Il y a trois étapes, mais cela semble difficile à construire avec Scratch, donc il est en attente. Quelle est la dérivation du nombre premier?

Recommended Posts

À propos de la méthode de division continue apprise en 4e année du primaire
À propos du rôle de la méthode initialize
[Order method] Définit l'ordre des données dans Rails
[Java] Gestion des Java Beans dans la chaîne de méthodes
À propos de l'idée des classes anonymes en Java
À propos de la méthode
À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets
Sortie sur la méthode, partie 2
À propos de la méthode cartographique
À propos de la méthode des ancêtres
À propos de la méthode to_s.
À propos de la gestion de Null
Sortie sur la méthode Partie 1
À propos de la description de Docker-compose.yml
Prise en compte de la méthode des temps