quel est le moyen le plus rapide de calculer le plus grand commun diviseur de n nombres?
Vous devriez utiliser l'algorithme GCD de Lehmer .
Sans récursion:
int result = numbers[0];
for(int i = 1; i < numbers.length; i++){
result = gcd(result, numbers[i]);
}
return result;
Pour les très grands tableaux, il peut être plus rapide d’utiliser le modèle de jointure en fourche, où vous divisez votre tableau et calculez gcds en parallèle. Voici quelques pseudocodes:
int calculateGCD(int[] numbers){
if(numbers.length <= 2){
return gcd(numbers);
}
else {
INVOKE-IN-PARALLEL {
left = calculateGCD(extractLeftHalf(numbers));
right = calculateGCD(extractRightHalf(numbers));
}
return gcd(left,right);
}
}
Vous voudrez peut-être trier d'abord les nombres et calculer le gcd de manière récursive à partir des deux plus petits nombres.
C++ 17
J'ai écrit cette fonction pour calculer gcd de n nombres en utilisant la fonction __gcd(int a, int b)
intégrée de C++.
int gcd(vector<int> vec, int vsize)
{
int gcd = vec[0];
for (int i = 1; i < vsize; i++)
{
gcd = __gcd(gcd, vec[i]);
}
return gcd;
}
Pour en savoir plus sur cette fonction, visitez ce lien .
Reportez-vous également à Algorithme GCD de Dijkstra à partir du lien suivant. Cela fonctionne sans division. Cela pourrait donc être un peu plus rapide (corrigez-moi si je me trompe.)
Utilisez l'algorithme Euclidean :
function gcd(a, b)
while b ≠ 0
t := b;
b := a mod b;
a := t;
return a;
Vous l'appliquez pour les deux premiers nombres, puis le résultat avec le troisième chiffre, etc ...:
read(a);
read(b);
result := gcd(a, b);
i := 3;
while(i <= n){
read(a)
result := gcd(result, a);
}
print(result);
Vous pouvez utiliser diviser et conquérir. Pour calculer gcdN ([]), vous divisez la liste en première moitié et seconde moitié. s'il n'a qu'un numéro pour chaque liste. vous calculez en utilisant gcd2 (n1, n2).
Je viens d'écrire un exemple de code rapide. (en supposant que tous les num de la liste sont des Ints positifs)
def gcdN(nums):
n = len(nums)
if n == 0: return "ERROR"
if n == 1: return nums[0]
if n >= 2: return gcd2(gcdN(nums[:n//2]), gcdN(nums[n//2:]))
def gcd2(n1, n2):
for num in xrange(min(n1, n2), 0, -1):
if n1 % num == 0 and n2 % num == 0:
return num
Si vous avez beaucoup de petits nombres, la factorisation peut être plus rapide.
//Java
int[] array = {60, 90, 45};
int gcd = 1;
outer: for (int d = 2; true; d += 1 + (d % 2)) {
boolean any = false;
do {
boolean all = true;
any = false;
boolean ready = true;
for (int i = 0; i < array.length; i++) {
ready &= (array[i] == 1);
if (array[i] % d == 0) {
any = true;
array[i] /= d;
} else all = false;
}
if (all) gcd *= d;
if (ready) break outer;
} while (any);
}
System.out.println(gcd);
(fonctionne pour quelques exemples, mais pas vraiment testé)
//Recursive solution to get the GCD of Two Numbers
long long int gcd(long long int a,long long int b)<br>
{
return b==0 ? a : gcd(b,a%b);
}
int main(){
long long int a,b;
cin>>a>>b;
if(a>b) cout<<gcd(a,b);
else cout<<gcd(b,a);
return 0;
}
Ci-dessous, le code source du programme C permettant de trouver des nombres HCF de N à l’aide de tableaux.
#include<stdio.h>
int main()
{
int n,i,gcd;
printf("Enter how many no.s u want to find gcd : ");
scanf("%d",&n);
int arr[n];
printf("\nEnter your numbers below :- \n ");
for(i=0;i<n;i++)
{
printf("\nEnter your %d number = ",i+1);
scanf("%d",&arr[i]);
}
gcd=arr[0];
int j=1;
while(j<n)
{
if(arr[j]%gcd==0)
{
j++;
}
else
{
gcd=arr[j]%gcd;
i++;
}
}
printf("\nGCD of k no.s = %d ",gcd);
return 0;
}
Pour plus d'informations, reportez-vous à ce site Web pour plus de précisions .......
Voici une méthode de gcd qui utilise la propriété suivante: gcd (a, b, c) = gcd (a, gcd (b, c)).
Il utilise la méthode gcd de BigInteger car il est déjà optimisé.
public static BigInteger gcd(BigInteger[] parts){
BigInteger gcd = parts[0];
for(int i = 1; i < parts.length; i++)
gcd = parts[i].gcd(gcd);
return gcd;
}
Un JavaScript unique (ES6) récursif pour un nombre quelconque de chiffres.
const gcd = (a, b, ...c) => b ? gcd(b, a % b, ...c) : c.length ? gcd(a, ...c) : Math.abs(a);