NOMBRE NARCISSIQUE (WIN32, ASM)

cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 - 27 mars 2005 à 22:14
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 - 2 avril 2005 à 14:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30371-nombre-narcissique-win32-asm

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
2 avril 2005 à 14:50
Mise a jour : passage en fastcall des fonctions Puiss et asmDivide (en gros, j'ai suivi les conseils de Brunews). N'hésitez a me dire s'il ya des trucs qui ne vont tjrs pas.
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
30 mars 2005 à 20:07
Une enorme couille dans mes 2 codes (C et ASM), je rectifie ca le plus vite possible (deja fait, mais tres lent et pas pris en compte les recommandations de Brunews).

Pardon de l'erreur.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mars 2005 à 15:07
JCDjcd à la sienne, mais je sais pas ce qu'elle vaut...
fred100582 Messages postés 37 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 6 décembre 2005
30 mars 2005 à 12:24
Bonjour, je travaille sur un prog qui utilise bcp de random et je voudrais savoir si qq'un a codé une fonction random qui serait rapide et pas trop gourmande (en langage c).

en vous remerciant.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
29 mars 2005 à 23:15
vecchio56> j'y peux rien si nous les africains on connait pas exactement notre date de naissance !!
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
29 mars 2005 à 20:16
mdr ^^
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 mars 2005 à 20:14
cosmobob> Les gens d'âge 'Inconnu' ne sont pas acceptés
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 mars 2005 à 20:12
Pamaury> Bien sur, meme en comprenant mal le sujet on peut poster un mauvais programme qui passe pourtant tous les tests...
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
29 mars 2005 à 20:02
20 ans
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
29 mars 2005 à 19:33
juste une remarque: au concours ce code avait une difficulté moyenne et il est parfaitement faisable en 10 min .
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
29 mars 2005 à 18:23
c'est quoi la limite d'age pour passer prologin??
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
29 mars 2005 à 18:14
cosmobob, y a bcp de jeunots ici :)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 mars 2005 à 17:20
Pourquoi des PUSH POP sur eax et edx dans tes funcs ??? ça bouffe des cycles inutilement, sans compter que sans cela Puiss() pourrait passer en __fastcall sans aucun problème car n'utilise que les 3 registres principaux, y a rien à sauvegarder.
Même discours pour asmNarcissique() et asmDivide(), y a rien à sauvegarder. Par contre faut utiliser les registres (edi,esi,ebx,ebp) au lieu de lire et écrire en mémoire dans la boucle, devrait aller nettement plus vite si la boucle est longue.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
29 mars 2005 à 12:32
c'est reservé aux jeunots non?
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
28 mars 2005 à 19:34
Il a été posté sur www.prologin.org hier! dnas la section entraînement, demi finales, 2005. La prochaine fois, participe au concours!
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 mars 2005 à 19:30
On peut récupérer le sujet original?
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
28 mars 2005 à 18:57
En effet, la définition qu'on s'est tapée était assez compliquée. Les parties, se sont les chiffres, mais aussi les paquets de chiffres. Genre:

1000 -> 1000; 1, 0, 0, 0
10000 -> 10000; 10, 00; 1, 0, 0, 0, 0

et ce pour tous les nombres jusque 1000000 je pense (non compris), et avec la règle exponentielle et factorielle, c'était bien long. mon code faisait largement 150 lignes je pense ...
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 mars 2005 à 18:53
vecchio > Autant pour moi, la definition de ce site ne s'accorde pas vraiment avec la definition que j'ai eu. Faudrait que je cherche sur le net la definition tel que je l'ai codé.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 mars 2005 à 18:52
40 minutes pour faire ca? Il me semble pourtant que ma fonction de 10 lignes marche bien...
Kirua, comprends-tu ce qu'AlexMAN a voulu me dire?
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
28 mars 2005 à 18:48
Voui, il était aussi à prologin de lille (26 février), et bcp de gens ont passé bcp de temps dessus. C'est le tout dernier exo que j'aie fait, il m'a été rajouté. Il me restait 40 minutes et je l'ai fini tout juste ... c'est étonnament long, en effet. Reste plus qu'à attendre les résultats ^_^.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 mars 2005 à 17:44
J'ai lu:

Nombre égal
à la somme de ses n chiffres
chacun élevé à la puissance n

Qu'est ce que tu entends pas parties??
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 mars 2005 à 17:38
vecchio > Tu n'as pas regardé la definition, regarde le lien, et tu verras que c'est pas si simple :

Exemple : 1634 est narcissique car 1^4+6^4+3^4+4^4 = 1634

1000 est narcissique car 10^3+0^3 = 1000

Il faut que la somme des chiffres (ou PARTIES des chiffres) qui composent le nombre a une certaine puissance soit egale au nombre.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 mars 2005 à 16:34
Voila ma solution, faudrait comparer pour voir:

#include <windows.h>
#include "resource.h"

WNDPROC oldEditProc;
HINSTANCE hInstance;


int puissance(int base, int exposant)
{
int i, res = 1;
for(i = 0; i < exposant; i++)
res *= base;
return res;
}

BOOL Narcissique(char* nombre, int longueur)
{
int n = atoi(nombre);
int sommePartielle = 0;
while(*nombre)
{
sommePartielle += puissance(*nombre - '0', longueur);
if(sommePartielle > n)
return FALSE;
nombre++;
}
return sommePartielle == n;
}

DWORD dwBuffer;
char szBuffer[16];

LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
if (WM_CHAR == message) {
if ((wparam < 48 || wparam > 57) && wparam != VK_BACK) { MessageBeep(0); return 0; }
if (szBuffer[0]) {
szBuffer[0] = 0;
SetDlgItemText(GetParent(hwnd), IDST_NARC, szBuffer);
}
}

return CallWindowProc(oldEditProc, hwnd, message, wparam, lparam);
}

BOOL CALLBACK DlgProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
int length = 0;

switch (message) {
case WM_INITDIALOG:
SetClassLong(hwnd, GCL_HICON, (long)LoadIcon(0, IDI_APPLICATION));
oldEditProc = SetWindowLong(GetDlgItem(hwnd, IDEC_NARC), GWL_WNDPROC, (long)EditProc);
SendMessage(GetDlgItem(hwnd, IDEC_NARC), EM_SETLIMITTEXT, 10, 0);
return 1;
case WM_COMMAND:
if (IDCANCEL == wparam)
{
EndDialog(hwnd, 0);
}
else if (IDOK == wparam)
{
length = GetDlgItemText(hwnd, IDEC_NARC, szBuffer, 10);
dwBuffer = Narcissique(szBuffer, length) ? 'iuO' : 'noN';
SetDlgItemText(hwnd, IDST_NARC, (char*)&dwBuffer);
}
return 0;
}

return 0;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE p, LPSTR q, int r)
{

hInstance = hInst;
DialogBoxParam(hInst, (LPCTSTR)IDD_NARC, 0, DlgProc, 0);
return 0;
}
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 mars 2005 à 16:20
Au début tu as un nombre exprimé sous forme de char*. Pourquoi le transformer en int si c'est pour ensuite faire des divisions par 10?
Par ailleurs je trouve la fonction Narcissique étonnament longue compte tenu du problème qui à l'air assez facile, ou alors ya quelque chose que j'ai pas compris...
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 mars 2005 à 10:00
Je l'ai expliqué dans la source pourquoi de l'asm.
Et pis c'est vrai, j'ai hesité a le poster sur asmfr.com ou cppfrance.com, mais etant donné que pas tout est en ASM, j'ai preféré le poster ici (et aussi pck c'est un *.vcproj...etc).
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
28 mars 2005 à 09:55
tiens c'est marrant je suis tombé sur cette question au concours Prologin avant-hier !!
Je vois pas réellement l'intérêt d'utiliser de l'assembleur ici puisque çà passe très bien en C mais enfin si tu veux aller le plus vite possible pourquoi pas mais dans ce cas autant le poster sur asmfrance.com :)
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 mars 2005 à 00:04
Merci bcp Vincent.
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 mars 2005 à 23:09
Je pense qu'on peut mettre les fonctions asmDivide() et Puiss() en __inline, mais je viens d'essayer et je n'ai pas remarqué de gains notables cette fois ci.
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
27 mars 2005 à 22:14
un code de qualité ^^
je pense que t'aurais eu le temps de coder ça le jour du concours alex ^^
Rejoignez-nous