OVH Cloud OVH Cloud

[Debutant] Attribuer une cote

13 réponses
Avatar
Timour
Bonjour,
j'amerais que vous attribuiez une cote à ma fonction qui calcule tous
les diviseurs d'un nombre.
Merci

int main()
{
using namespace std ;
int a, x ;
cout << "Entrez le nombre à calculer : " ;
cin >> a ;
for ( int x = a ; x != 0; x-- )
{
if ( a % x == 0 )
{
cout << x << "\n" ;
}
}
return 0;
}

10 réponses

1 2
Avatar
Samuel Krempp
le Saturday 31 January 2004 14:57, écrivit :

Bonjour,
j'amerais que vous attribuiez une cote à ma fonction qui calcule tous
les diviseurs d'un nombre.
Merci


C'est quoi une cote ?

using namespace std ;
int a, x ;
cout << "Entrez le nombre à calculer : " ;
cin >> a ;
for ( int x = a ; x != 0; x-- )
{
if ( a % x == 0 )
{
cout << x << "n" ;
}
}
return 0;
}


en tout cas le programme fait ce qu'il faut (sauf si a est négatif, auquel
cas la boucle sera un peu longuette)

en parcourant les diviseurs éventuels dans l'autre sens il y a moyen
d'afficher la décomposition en facteurs premiers en changeant pas grand
chose.

--
Sam

Avatar
espie
In article <401ba60b$0$260$,
Timour wrote:
Bonjour,
j'amerais que vous attribuiez une cote à ma fonction qui calcule tous
les diviseurs d'un nombre.
Merci

int main()
{
using namespace std ;
int a, x ;
cout << "Entrez le nombre à calculer : " ;
cin >> a ;
for ( int x = a ; x != 0; x-- )
{
if ( a % x == 0 )
{
cout << x << "n" ;
}
}
return 0;
}




Si tu n'as pas de contraintes sur l'ordre des diviseurs, fais plutot

#include <iostream>

int
main()
{
std::cout << "Entrez le nombre dont vous voulez les diviseurs: ";

int a;
std::cin >> a;

for (int x = 1; x * x <= a; ++x) {
if (a % x == 0) {
std::cout << x << "n";
int y = a/x;
if (y != x)
std::cout << y << "n";
}
}
}


L'air de rien, ca te fait passer de O(n) a O(sqrt(n))

Avatar
Fabien LE LEZ
On Sat, 31 Jan 2004 19:50:02 +0000 (UTC),
(Marc Espie) wrote:

for (int x = 1; x * x <= a; ++x) {


Ne serait-ce pas plus efficace de calculer la racine carrée une seule
fois au début ?

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Avatar
Godot
"Fabien LE LEZ" a écrit dans le message de
news:
On Sat, 31 Jan 2004 19:50:02 +0000 (UTC),
(Marc Espie) wrote:

for (int x = 1; x * x <= a; ++x) {


Ne serait-ce pas plus efficace de calculer la racine carrée une seule
fois au début ?


Un compilateur moderne est capable d'optimiser ça non ?


Avatar
Godot
Désolé j'ai rien dit :-)
Avatar
Timour
Samuel Krempp wrote:
le Saturday 31 January 2004 14:57, écrivit :


Bonjour,
j'amerais que vous attribuiez une cote à ma fonction qui calcule tous
les diviseurs d'un nombre.
Merci



C'est quoi une cote ?
Je comrepnds ca comme " Attribuer une valeur à qulque chose sur une

échelle de 10 par exemple.


using namespace std ;
int a, x ;
cout << "Entrez le nombre à calculer : " ;
cin >> a ;
for ( int x = a ; x != 0; x-- )
{
if ( a % x == 0 )
{
cout << x << "n" ;
}
}
return 0;
}



en tout cas le programme fait ce qu'il faut (sauf si a est négatif, auquel
cas la boucle sera un peu longuette)

en parcourant les diviseurs éventuels dans l'autre sens il y a moyen
d'afficher la décomposition en facteurs premiers en changeant pas grand
chose.

Ok, merci !



Avatar
Timour
Marc Espie wrote:
In article <401ba60b$0$260$,
Timour wrote:

Bonjour,
j'amerais que vous attribuiez une cote à ma fonction qui calcule tous
les diviseurs d'un nombre.
Merci

int main()
{
using namespace std ;
int a, x ;
cout << "Entrez le nombre à calculer : " ;
cin >> a ;
for ( int x = a ; x != 0; x-- )
{
if ( a % x == 0 )
{
cout << x << "n" ;
}
}
return 0;
}





Si tu n'as pas de contraintes sur l'ordre des diviseurs, fais plutot

#include <iostream>

int
main()
{
std::cout << "Entrez le nombre dont vous voulez les diviseurs: ";

int a;
std::cin >> a;

for (int x = 1; x * x <= a; ++x) {
if (a % x == 0) {
std::cout << x << "n";
int y = a/x;
if (y != x)
std::cout << y << "n";
}
}
}


L'air de rien, ca te fait passer de O(n) a O(sqrt(n))
Oui c'est vrai que votre fonction est plus rapide mais l'ordre dans

lequel sont affichés les diviseurs n'est pas très présentatif..


Avatar
Fabien LE LEZ
On Sat, 31 Jan 2004 21:33:51 +0000, Timour
wrote:

Oui c'est vrai que votre fonction est plus rapide mais l'ordre dans
lequel sont affichés les diviseurs n'est pas très présentatif..


Eh bien, il suffit de mettre les diviseurs dans un tableau, et
d'afficher le tableau à la fin, après l'avoir trié.

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Avatar
Fabien LE LEZ
On Sun, 01 Feb 2004 01:22:13 +0000, Timour
wrote:

Eh bien, il suffit de mettre les diviseurs dans un tableau, et
d'afficher le tableau à la fin, après l'avoir trié.

Oui pas bête


lol


C'est la première fois que je vois un conteneur faire hurler de
rire...

mais le problème c'est que je sais pas encore faire ca


std::set<int> diviseurs;
int racine_carree= sqrt (a) + 1; /* J'ajoute le "+1" pour éviter les
problèmes d'arrondis */

for (int x = 1; x<=racine_carree; ++x)
{
if (a % x == 0)
{
diviseurs.insert (x);
diviseurs.insert (a/x);
}
}

std::copy (diviseurs.begin(), diviseurs.end(),
std::ostream_iterator<int> (std::cout, "n"));

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2


Avatar
Timour
Fabien LE LEZ wrote:
On Sat, 31 Jan 2004 21:33:51 +0000, Timour
wrote:


Oui c'est vrai que votre fonction est plus rapide mais l'ordre dans
lequel sont affichés les diviseurs n'est pas très présentatif..



Eh bien, il suffit de mettre les diviseurs dans un tableau, et
d'afficher le tableau à la fin, après l'avoir trié.

Oui pas bête lol, mais le problème c'est que je sais pas encore faire ca

: )))). Mais on va apprendre : )))


1 2