2
votes

plus grande fonction de facteur commun

J'essaie de résoudre ce problème de défi, où je suis censé trouver le GCD de deux nombres entrés en référençant une fonction. Cependant, je ne sais pas exactement où je me trompe. Voici la question exacte pour référence:

Ecrivez une fonction qui accepte x et y comme paramètres d'entrée et calcule et renvoie le plus grand dénominateur commun des deux valeurs.

J'ai essayé de créer une fonction pour trouver le GCD , puis simplement référencer la fonction plus tard. Je ne sais pas ce que je fais de mal.

#include <iomanip>
using namespace std;


int gcd;

cout << "Enter a valid integer: ";
  cin >> n >> m;

int digit = number(n, m);



return 0;
}

int number(int n, int m){

  for (int i=1; i<=n; ++i){
    int gcd = i;
    if(n%i==0 && m%i==0) {
      break;
  }

    return gcd;
}
  }

Je devrais comprendre ceci: Entrez deux nombres entiers: 12 8 Le GCD de 12 et 8 est 4.

Mais à la place, j'obtiens une erreur avec gcd qui n'est pas déclaré dans cette portée, ce qui n'a pas de sens car je l'ai déclaré comme un int à la fois dans le fonction et à l'extérieur.


8 commentaires

Qu'espérez-vous que la ligne return gcd (n, m); fasse?


C'était une erreur, je viens de me rendre compte; Je veux simplement imprimer le pgcd dans ce cas des deux nombres, qui seraient représentés par i.


@RSahu après avoir supprimé l'erreur dans la ligne de retour et l'avoir simplement transformée en retour gcd; , J'obtiens toujours l'erreur que gcd n'est pas déclaré.


Cette erreur a du sens. gcd est défini dans la portée de l'instruction if . Cela n'existe pas en dehors de cela.


N'oubliez pas que les accolades introduisent une nouvelle portée. De plus, le gcd dans main n'a aucun rapport avec le gcd dans l'autre fonction. Découvrez la portée lexicale dans votre livre C ++ préféré.


Une fois que vous obtenez cela pour compiler et renvoyer une valeur, vous aurez trouvé le plus petit diviseur commun, qui est 1.


@molbdnilo ive a mis à jour le code, mais que dois-je faire pour résoudre ce problème? Je suis confus.


Qu'est-il arrivé aux critères non récursifs - c'était dans le titre mais ensuite il a été supprimé?


4 Réponses :


1
votes

J'espère que vous cherchez quelque chose comme ceci

#include <stdio.h>

int hcf(int, int); //function declaration 

int main()
{
int a, b, result;

printf(“Enter the two numbers to find their HCF: “);
scanf(“%d%d”, &a, &b);
result = hcf(a, b);
printf(“The HCF of %d and %d is %d.\n”, a, b, result);

return 0;
}

int hcf(int a, int b)
{
            while (a != b)
            {
                  if (a > b)
                 {
                            a = a – b;
                  }
           else
                    {
                         b = b – a;
                   }
}
return a;
}

Programme simple et facile à comprendre.


0 commentaires

0
votes

Votre fonction a besoin d'un peu d'ajustement pour fonctionner correctement.

  1. gcd doit être défini en dehors de la boucle for pour pouvoir être utilisé comme valeur de retour.
  2. Dans la boucle for , utiliser break dans l'instruction if est logiquement incorrecte. Si vous faites cela, vous obtiendrez toujours 1 comme réponse. Après tout, n% 1 et m% 1 seront zéro pour toutes les valeurs de n et m .

Voici une version mise à jour qui fonctionne dans mes tests.

int gcdfunction(int n, int m){

   // Make sure n is the smaller of the numbers.
   if ( n > m )
   {
      std::swap(n, m);
   }

   while ( m % n != 0 )
   {
      int next = m % n;
      m = n;
      n = next;
   }

   return n;
}

Veuillez noter que l'algorithme euclidien est probablement l'algorithme le plus efficace pour calculer le GCD de deux nombres.

L'algorithme euclidien peut être facilement implémenté en utilisant un non- fonction récursive aussi.

int gcdfunction(int n, int m){

   int gcd = 1;
   for (int i=1; i<=n; ++i){
      if(n%i==0 && m%i==0) {
         gcd = i;
      }
   }

   return gcd;
}


2 commentaires

J'ai fait une commande cout, étant cout << gcd; , et j'obtiens parfaitement les facteurs de mes deux nombres. Cependant, toutes les valeurs de i qui remplissent la boucle sont imprimées; comment obtenir uniquement la valeur la plus élevée pour être imprimé? Si je mets 12 et 20, les nombres sortis sont 1, 2 et 4.


@noviceclasscoder, n'imprime que la valeur de retour de la fonction, dans main . Après le retour de la fonction, utilisez std :: cout << "GCD:" << variable << std :: endl;



1
votes

Il existe de très bons algorithmes récursifs pour cela, mais comme ils ne sont pas autorisés, j'ai nettoyé votre implémentation:

  • Remplacer iomanip défectueux par iostream
  • Changez votre invite de saisie de "Entrez un entier" à "Entrez deux entiers"
  • J'ai supprimé de votre main, vous n'en aviez pas besoin
  • Variable remplacée par gcd dans votre main
  • Ajout d'un cout pour afficher le résultat dans votre main
  • Avec votre gcdfunction, je l'ai réécrit en ne gardant que votre condition de pause
  • La boucle correspondant à votre condition de rupture doit être un compte à rebours à partir d'un nombre approprié (c'est-à-dire que min (m, n) doit être la valeur initiale et nous bouclons en arrière jusqu'à ce que nous atteignions 1).
#include <iostream>
using namespace std;

int gcdfunction(int n, int m);

int main() {
  int n, m;

  cout << "Enter two integers: ";
  cin >> n >> m;

  int gcd = gcdfunction(n, m);
  cout << "GCD: " << gcd << "\n";
  return 0;
}

int gcdfunction(int n, int m){
  for (int i = m<=n ? m:n ; i > 1; i--) {
    if (n%i==0 && m%i==0) return i;
  }
  return 1;
}


0 commentaires

1
votes

Solution récursive facile ... essayez ceci.

#include<iostream>
using namespace std;
int main()
{
   int a,b;
   cout<<"Enter two number: ";
   cin>>a>>b;
   cout<<"GCD of two number: "<<gcd(a,b)<<endl;
}

La même chose peut être obtenue sans récursivité -

int gcd(int a, int b)
{
     while(b!=0)
     {
         int tmp = a;
         a = b;
         b = tmp % b;
     {
     return a;
 }

Maintenant la fonction principale. .

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


1 commentaires

int gcd (int x, int y) {retourne y? gcd (y, x% y): x;} fonctionnera aussi