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.
4 Réponses :
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.
Votre fonction a besoin d'un peu d'ajustement pour fonctionner correctement.
gcd doit être défini en dehors de la boucle for pour pouvoir être utilisé comme valeur de retour. 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;
}
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;
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:
#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;
}
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);
}
int gcd (int x, int y) {retourne y? gcd (y, x% y): x;} fonctionnera aussi
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.
gcdest défini dans la portée de l'instructionif. Cela n'existe pas en dehors de cela.N'oubliez pas que les accolades introduisent une nouvelle portée. De plus, le
gcddansmainn'a aucun rapport avec legcddans 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é?