begin process at 2012 05 27 18:56:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > NOMBRE NARCISSIQUE (WIN32, ASM)

NOMBRE NARCISSIQUE (WIN32, ASM)


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :27/03/2005 Date de mise à jour :02/04/2005 14:49:23 Vu / téléchargé :4 777 / 96

Auteur : AlexMAN

Ecrire un message privé
Commentaire sur cette source (29)
Ajouter un commentaire et/ou une note

 Description

Bonjour,

Je vous presente (sans pretention aucune), un code (C/ASM) permettant de savoir si un nombre est narcissique ou pas.
Nombre narcissique : http://membres.lycos.fr/villemingerard/Formes/Narc issi.htm
J'ai vu une autre definition qui reprenait celle ci, mais qui envisageait aussi le cas ou la somme des factorielles des chiffres (ou parties de chiffres) d'un nombre etait egale a ce nombre. (cf lien precedent, vous comprendrez mieux).  Etant donné qu'au point de vu programmation, verifier les factorielles etc.. ne m'apprenait rien (reprise du code sur les puissance, cf lien ;)), je ne l'ai pas codé.

Si j'ai fait ce code en ASM, c'est juste une petite revanche envers moi meme, car je suis, un jour, tombé sur cet exercice, et j'ai perdu mon temps a le coder, alors que c'etait simple...Enfin bon, certains me comprendront ;)

Je souhaite bien entendu aussi avoir des avis, surtout negatif pour me dire ce qui ne va pas.

Source

  • #include <windows.h>
  • #include "resource.h"
  • WNDPROC oldEditProc;
  • HINSTANCE hInstance;
  • /*__declspec(naked) void __stdcall PuissFPU(int n, int exp)
  • {
  • __asm {
  • mov ecx, [esp + 8] //eax == exp
  • fild dword ptr[esp + 4] //empile n, ST(1) == n
  • dec ecx
  • jle Fin
  • fld ST //empile n, ST(0) == n, Contiendra le resultat
  • Deb:
  • fmul ST(1), ST
  • dec ecx
  • test ecx, ecx
  • jne Deb
  • fstp ST
  • Fin:
  • fistp dword ptr[esp - 4]
  • mov ecx, [esp - 4]
  • ret 8
  • }
  • }*/
  • //Resultat renvoyé dans ecx
  • __declspec(naked) void __fastcall Puiss(int n, int exp)
  • {
  • __asm {
  • mov eax, ecx
  • dec edx
  • jle End
  • Deb:
  • imul ecx, eax
  • dec edx
  • test edx, edx
  • jne Deb
  • End:
  • ret 0
  • }
  • }
  • int __stdcall len(int n)
  • {
  • if (n >= 1000000000) return 10;
  • if (n >= 100000000) return 9;
  • if (n >= 10000000) return 8;
  • if (n >= 1000000) return 7;
  • if (n >= 100000) return 6;
  • if (n >= 10000) return 5;
  • if (n >= 1000) return 4;
  • if (n >= 100) return 3;
  • if (n >= 10) return 2;
  • return 1;
  • }
  • __declspec(naked) int __fastcall sPuiss(int n, int exp)
  • {
  • __asm {
  • mov eax, ecx
  • dec edx
  • Deb:
  • imul eax, ecx
  • dec edx
  • test edx, edx
  • jne Deb
  • ret 0
  • }
  • }
  • int Narcissique(int n)
  • {
  • int lSomme, lSommePrec, lTemp;
  • int i, j, iTaille, exp, iPuissDix = 10;
  • iTaille = len(n);
  • for (exp = 2; exp < 32; ++exp) {
  • iPuissDix = 10;
  • for (i = 1; i < iTaille; ++i) {
  • if (iTaille % i) goto EndFor;
  • lTemp = n;
  • lSomme = 0;
  • while (lTemp) {
  • lSomme += sPuiss(lTemp % iPuissDix, exp);
  • lTemp /= iPuissDix;
  • }
  • if (lSomme == n) return 1;
  • if (lSomme == lSommePrec) break;
  • if (lSomme > n && i == 1) return 0;
  • if (lSomme > n) break;
  • lSommePrec = lSomme;
  • EndFor:
  • iPuissDix *= 10;
  • }
  • }
  • return 0;
  • }
  • //0 < Exp <= 4
  • //lTemp dans eax
  • //Modulo dans ecx
  • //Restaure edx
  • __declspec(naked) void __fastcall asmDivide(int Exp, int lTemp)
  • {
  • __asm {
  • mov eax, edx
  • cmp ecx, 1
  • jne L1
  • mov [esp - 4], edx
  • //Division par 10
  • mov edx, 3435973837
  • mul edx
  • shr edx, 3
  • //Modulo (lTemp - (Resultat * 10))
  • mov eax, edx
  • mov ecx, edx
  • shl eax, 3
  • shl ecx, 1
  • add eax, ecx
  • mov ecx, [esp - 4]
  • sub ecx, eax
  • mov eax, edx
  • ret 0
  • L1:
  • cmp ecx, 2
  • jne L2
  • mov [esp - 4], edx
  • //100
  • mov edx, 2748779069
  • inc eax
  • mul edx
  • shr edx, 6
  • //Modulo (lTemp - (Resultat * 100))
  • mov eax, edx
  • mov ecx, edx
  • mov edx, 100
  • mul edx
  • mov edx, ecx
  • mov ecx, [esp - 4]
  • sub ecx, eax
  • mov eax, edx
  • ret 0
  • L2:
  • cmp ecx, 3
  • jne L3
  • mov [esp - 4], edx
  • //1000
  • mov edx, 2199023256
  • mul edx
  • shr edx, 9
  • //Modulo (lTemp - (Resultat * 1000))
  • mov eax, edx
  • mov ecx, edx
  • mov edx, 1000
  • mul edx
  • mov edx, ecx
  • mov ecx, [esp - 4]
  • sub ecx, eax
  • mov eax, edx
  • ret 0
  • L3:
  • cmp ecx, 4
  • jne L4
  • mov [esp - 4], edx
  • //10000
  • mov edx, 3518437209
  • mul edx
  • shr edx, 13
  • //Modulo (lTemp - (Resultat * 10000))
  • mov eax, edx
  • mov ecx, edx
  • mov edx, 10000
  • mul edx
  • mov edx, ecx
  • mov ecx, [esp - 4]
  • sub ecx, eax
  • mov eax, edx
  • ret 0
  • L4:
  • xor eax, eax
  • xor ecx, ecx
  • ret 0
  • }
  • }
  • __declspec(naked) int __stdcall asmNarcissique(int n)
  • {
  • //(ESP) => iTaille
  • //(ESP + 4) => exp
  • //(ESP + 8) => i
  • //(ESP + 12) => lSommePrec
  • //(ESP + 24) => n
  • __asm {
  • mov edx, [esp + 4]
  • push esi
  • push edi
  • push ebx
  • lea esi, [esp - 16]
  • mov esp, esi
  • xor ecx, ecx
  • mov eax, 1
  • mov [esi + 4], ecx
  • mov [esi + 8], ecx
  • mov ecx, 0FFFFFFFFh
  • mov [esi + 12], ecx ;on initialise avec la plus grande valeur possible.
  • push edx
  • call len ;Taille du nombre
  • ;shr eax, 1
  • mov [esi], eax ;sauve taille sur la pile
  • DebExp:
  • mov eax, [esi + 4] ;exp
  • inc eax
  • cmp eax, 32
  • jg ret0
  • xor ecx, ecx
  • mov [esi + 4], eax
  • mov [esi + 8], ecx
  • DebTaille:
  • mov ecx, [esi + 8] ;i
  • mov eax, [esi] ;iTaille
  • inc ecx
  • mov [esi + 8], ecx ;sauve i
  • shr eax, 1
  • cmp ecx, eax
  • jg DebExp
  • mov eax, [esi]
  • xor edx, edx
  • div ecx
  • test edx, edx ;teste 'modulo' qui est dans edx
  • jne DebTaille
  • mov edi, [esi + 32] ;n
  • xor ebx, ebx ;iSomme == 0
  • WhileTmp: ;edi == lTemp
  • test edi, edi
  • jz Comp
  • mov edx, edi
  • call asmDivide ;lTemp == eax, Modulo == ecx
  • mov edx, [esi + 4]
  • mov edi, eax
  • call Puiss ;ecx == resultat
  • add ebx, ecx
  • mov ecx, [esi + 8] ;ressort i de la stack
  • jmp WhileTmp
  • mov [esi + 12], ebx ;SommePrec
  • Comp:
  • mov eax, [esi + 32]
  • cmp ebx, eax ; if (Somme == n) return 1;
  • jg TestI
  • jne C1
  • mov eax, 1
  • add esp, 16
  • pop ebx
  • pop edi
  • pop esi
  • ret 4
  • TestI:
  • cmp ecx, 1
  • jne DebExp
  • jmp ret0
  • C1:
  • mov eax, [esi + 12]
  • cmp edx, eax
  • jne DebTaille
  • ret0:
  • xor eax, eax
  • add esp, 16
  • pop ebx
  • pop edi
  • pop esi
  • ret 4
  • }
  • }
  • 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 iNarc = 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);
  • PostMessage(hwnd, WM_NEXTDLGCTL, GetDlgItem(hwnd, IDEC_NARC), 1);
  • return 0;
  • case WM_COMMAND:
  • if (IDCANCEL == wparam) {
  • EndDialog(hwnd, 0);
  • } else if (IDOK == wparam) {
  • int i = 0;
  • GetDlgItemText(hwnd, IDEC_NARC, szBuffer, 10);
  • iNarc = atoi(szBuffer);
  • if (!asmNarcissique(iNarc)) *((DWORD *)szBuffer) = 0x004E4F4E; //"NON"
  • else *((DWORD *)szBuffer) = 0x0049554F; //"OUI"
  • SetDlgItemText(hwnd, IDST_NARC, szBuffer);
  • }
  • 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;
  • }
#include <windows.h>
#include "resource.h"

WNDPROC oldEditProc;
HINSTANCE hInstance;

/*__declspec(naked) void __stdcall PuissFPU(int n, int exp) 
{
	__asm {
		mov		ecx, [esp + 8] //eax == exp
		fild	dword ptr[esp + 4] //empile n, ST(1) == n	
		dec		ecx
		jle		Fin
		fld		ST //empile n, ST(0) == n, Contiendra le resultat
Deb:
		fmul	ST(1), ST
		dec		ecx
		test	ecx, ecx
		jne		Deb	
		fstp	ST
Fin:
		fistp dword ptr[esp - 4]
		mov		ecx, [esp - 4]
		ret		8
	}
}*/

//Resultat renvoyé dans ecx
__declspec(naked) void __fastcall Puiss(int n, int exp)
{

	__asm {
		mov		eax, ecx
		dec		edx
		jle		End
Deb:
		imul	ecx, eax
		dec		edx
		test	edx, edx
		jne		Deb
End:	
		ret		0
	}
}

int __stdcall len(int n)
{
	if (n >= 1000000000) return 10;
	if (n >= 100000000) return 9;
	if (n >= 10000000) return 8;
	if (n >= 1000000) return 7;
	if (n >= 100000) return 6;
	if (n >= 10000) return 5;
	if (n >= 1000) return 4;
	if (n >= 100) return 3;
	if (n >= 10) return 2;

	return 1;
}

__declspec(naked) int __fastcall sPuiss(int n, int exp)
{
	__asm {
		mov		eax, ecx
		dec		edx
Deb:
		imul	eax, ecx
		dec		edx
		test	edx, edx
		jne		Deb
		ret		0
	}
}

int Narcissique(int n)
{
	int lSomme, lSommePrec, lTemp;
	int i, j, iTaille, exp, iPuissDix = 10;
 
	iTaille = len(n);

	for (exp = 2; exp < 32; ++exp) {
		iPuissDix = 10;
		for (i = 1; i < iTaille; ++i) {
			if (iTaille % i) goto EndFor;
			lTemp = n;
			lSomme = 0;
			while (lTemp) {
				lSomme += sPuiss(lTemp % iPuissDix, exp);
				lTemp /= iPuissDix;
			}
			if (lSomme == n) return 1;
			if (lSomme == lSommePrec) break;
			if (lSomme > n && i == 1) return 0;
			if (lSomme > n) break;
			lSommePrec = lSomme;
		EndFor:
			iPuissDix *= 10;
		}
	}

	return 0;
}

//0 < Exp <= 4
//lTemp dans eax
//Modulo dans ecx
//Restaure edx
__declspec(naked) void __fastcall asmDivide(int Exp, int lTemp)
{
	__asm {
		mov		eax, edx

		cmp		ecx, 1
		jne		L1
		mov		[esp - 4], edx
		//Division par 10
		mov   edx, 3435973837
		mul   edx
		shr   edx, 3
		//Modulo (lTemp - (Resultat * 10))
		mov		eax, edx
		mov		ecx, edx
		shl		eax, 3
		shl		ecx, 1
		add		eax, ecx
		mov		ecx, [esp - 4]
		sub		ecx, eax
		mov		eax, edx
		ret		0
L1:
		cmp		ecx, 2
		jne		L2
		mov		[esp - 4], edx
		//100
		mov   edx, 2748779069
		inc   eax
		mul   edx
		shr   edx, 6
		//Modulo (lTemp - (Resultat * 100))
		mov		eax, edx
		mov		ecx, edx 
		mov		edx, 100
		mul		edx
		mov		edx, ecx
		mov		ecx, [esp - 4]
		sub		ecx, eax
		mov		eax, edx
		ret		0
L2:
		cmp		ecx, 3
		jne		L3
		mov		[esp - 4], edx
		//1000
		mov   edx, 2199023256
		mul   edx
		shr   edx, 9
		//Modulo (lTemp - (Resultat * 1000))
		mov		eax, edx
		mov		ecx, edx 
		mov		edx, 1000
		mul		edx
		mov		edx, ecx
		mov		ecx, [esp - 4]
		sub		ecx, eax
		mov		eax, edx
		ret		0
L3:
		cmp		ecx, 4
		jne		L4
		mov		[esp - 4], edx
		//10000
		mov   edx, 3518437209
		mul   edx
		shr   edx, 13
		//Modulo (lTemp - (Resultat * 10000))
		mov		eax, edx
		mov		ecx, edx 
		mov		edx, 10000
		mul		edx
		mov		edx, ecx
		mov		ecx, [esp - 4]
		sub		ecx, eax
		mov		eax, edx
		ret		0
L4:
		xor		eax, eax
		xor		ecx, ecx
		ret		0
	}
}

__declspec(naked) int __stdcall asmNarcissique(int n)
{
	//(ESP)				=> iTaille
	//(ESP + 4)		=> exp
	//(ESP + 8)		=> i
	//(ESP + 12)	=> lSommePrec
	//(ESP + 24)	=> n
	__asm {
		mov		edx, [esp + 4]
		push	esi
		push	edi
		push	ebx
		lea		esi, [esp - 16]
		mov		esp, esi
		xor		ecx, ecx
		mov		eax, 1
		mov		[esi + 4], ecx
		mov		[esi + 8], ecx
		mov		ecx, 0FFFFFFFFh
		mov		[esi + 12], ecx						;on initialise avec la plus grande valeur possible.
		push	edx
		call	len												;Taille du nombre
		;shr		eax, 1
		mov		[esi], eax								;sauve taille sur la pile
DebExp:
    mov		eax, [esi + 4]						;exp
		inc		eax
		cmp		eax, 32
		jg		ret0
		xor		ecx, ecx
		mov		[esi + 4], eax
		mov		[esi + 8], ecx
DebTaille:
		mov		ecx, [esi + 8]						;i
		mov		eax, [esi]								;iTaille
		inc		ecx
		mov		[esi + 8], ecx						;sauve i
		shr		eax, 1
		cmp		ecx, eax									
		jg		DebExp
		mov		eax, [esi]
		xor		edx, edx
		div		ecx
		test	edx, edx									;teste 'modulo' qui est dans edx
		jne		DebTaille
		mov		edi, [esi + 32]						;n
		xor		ebx, ebx									;iSomme == 0
WhileTmp:	;edi == lTemp
		test	edi, edi
		jz		Comp
		mov		edx, edi
		call	asmDivide									;lTemp == eax, Modulo == ecx
		mov		edx, [esi + 4]
		mov		edi, eax
		call	Puiss											;ecx == resultat
		add		ebx, ecx
		mov		ecx, [esi + 8]						;ressort i de la stack
		jmp		WhileTmp
		mov		[esi + 12], ebx						;SommePrec
Comp:
		mov		eax, [esi + 32]
		cmp		ebx, eax									; if (Somme == n) return 1;
		jg		TestI
		jne		C1
		mov		eax, 1
		add		esp, 16
		pop		ebx
		pop		edi
		pop		esi
		ret		4
TestI:
		cmp		ecx, 1
		jne		DebExp
		jmp		ret0
	C1:
		mov		eax, [esi + 12]
		cmp		edx, eax
		jne		DebTaille
ret0:
		xor		eax, eax
		add		esp, 16
		pop		ebx
		pop		edi
		pop		esi
		ret		4		
	}
}	

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 iNarc = 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);
			PostMessage(hwnd, WM_NEXTDLGCTL, GetDlgItem(hwnd, IDEC_NARC), 1);
			return 0;
		case WM_COMMAND:
			if (IDCANCEL == wparam) {
				EndDialog(hwnd, 0);
			} else if (IDOK == wparam) {
				int i = 0;

				GetDlgItemText(hwnd, IDEC_NARC, szBuffer, 10);
				iNarc = atoi(szBuffer);
				
				if (!asmNarcissique(iNarc)) *((DWORD *)szBuffer) = 0x004E4F4E;	//"NON"
				else *((DWORD *)szBuffer) = 0x0049554F; //"OUI"
				SetDlgItemText(hwnd, IDST_NARC, szBuffer);			
			}
			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;
}

 Conclusion

J'ai codé la version FPU de la fonction Puissance, mais elle est beaucoup plus lente que la version avec registres generaux.
Le code ASM est un petit peu (mais notablement) plus rapide que le code C avec toutes optimisations (de VC++ ;)).

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 mars 2005 09:14:43 :
Rectification de la fonction C.
02 avril 2005 14:49:24 :
Prise en compte des conseils de Brunews, je n'ai malheureusement pas eu le temps de tester. Il y a une instruction "div", mais elle me permet de gagner du temps (evite plusieurs boucles) et est necessaire pour ne pas renvoyer de faux resultats.

 Sources du même auteur

Source avec Zip LISTVIEW PATHFINDING (WIN32)
Source avec Zip Source avec une capture PANNEAU LUMINEUX (WIN32)
Source avec Zip MODIFIER ICONE REPERTOIRE [C][WIN32]
Source avec Zip Source avec une capture VERSION WINDOWS
Source avec Zip Source avec une capture ALERTE FILM[WIN32][VC.NET]

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de Alain Proviste le 27/03/2005 22:14:51 administrateur CS

un code de qualité ^^
je pense que t'aurais eu le temps de coder ça le jour du concours alex ^^

Commentaire de AlexMAN le 27/03/2005 23:09:11

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.

Commentaire de AlexMAN le 28/03/2005 00:04:03

Merci bcp Vincent.

Commentaire de Pamaury le 28/03/2005 09:55:00

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 :)

Commentaire de AlexMAN le 28/03/2005 10:00:46

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).

Commentaire de vecchio56 le 28/03/2005 16:20:34 administrateur CS

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...

Commentaire de vecchio56 le 28/03/2005 16:34:04 administrateur CS

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;
}

Commentaire de AlexMAN le 28/03/2005 17:38:37

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.

Commentaire de vecchio56 le 28/03/2005 17:44:52 administrateur CS

J'ai lu:

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

Qu'est ce que tu entends pas parties??

Commentaire de Kirua le 28/03/2005 18:48:28

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 ^_^.

Commentaire de vecchio56 le 28/03/2005 18:52:43 administrateur CS

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?

Commentaire de AlexMAN le 28/03/2005 18:53:40

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é.

Commentaire de Kirua le 28/03/2005 18:57: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 ...

Commentaire de vecchio56 le 28/03/2005 19:30:27 administrateur CS

On peut récupérer le sujet original?

Commentaire de Kirua le 28/03/2005 19:34:13

Il a été posté sur www.prologin.org hier! dnas la section entraînement, demi finales, 2005. La prochaine fois, participe au concours!

Commentaire de cosmobob le 29/03/2005 12:32:50

c'est reservé aux jeunots non?

Commentaire de BruNews le 29/03/2005 17:20:25 administrateur CS

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.

Commentaire de Kirua le 29/03/2005 18:14:36

cosmobob, y a bcp de jeunots ici :)

Commentaire de cosmobob le 29/03/2005 18:23:55

c'est quoi la limite d'age pour passer prologin??

Commentaire de Pamaury le 29/03/2005 19:33:42

juste une remarque: au concours ce code avait une difficulté moyenne et il est parfaitement faisable en 10 min .

Commentaire de Kirua le 29/03/2005 20:02:12

20 ans

Commentaire de vecchio56 le 29/03/2005 20:12:50 administrateur CS

Pamaury> Bien sur, meme en comprenant mal le sujet on peut poster un mauvais programme qui passe pourtant tous les tests...

Commentaire de vecchio56 le 29/03/2005 20:14:41 administrateur CS

cosmobob> Les gens d'âge 'Inconnu' ne sont pas acceptés

Commentaire de Kirua le 29/03/2005 20:16:12

mdr ^^

Commentaire de cosmobob le 29/03/2005 23:15:47

vecchio56> j'y peux rien si nous les africains on connait pas exactement notre date de naissance !!

Commentaire de fred100582 le 30/03/2005 12:24:52

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.

Commentaire de vecchio56 le 30/03/2005 15:07:39 administrateur CS

JCDjcd à la sienne, mais je sais pas ce qu'elle vaut...

Commentaire de AlexMAN le 30/03/2005 20:07:48

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.

Commentaire de AlexMAN le 02/04/2005 14:50:41

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.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales