Calcul avec des nombre jusqu'a 10^10000 maj

0/5 (60 avis)

Vue 8 143 fois - Téléchargée 275 fois

Description

REGARDER LA CAPTURE D'ECRAN, CE SERAS PLUS EXPLICIT!
permet des calculs avec des nombre jusqu'a 10^10000 (!) avec une précision à l'unité!
(on peut aller jusqu'a 10^n avec n de type int)
ex :
1234568579*1234568581=1524159578723216399
aucun programme n'a une tel présision, meme pas en 64 bit!
type : _uint (unsigned int)
addition,soustraction,multiplication,division,modulo,puissance,factoriel
a+b,a-b,a*b,a/b,a%b,!b (et non b!,pour les matheux)

Source / Exemple :


#include "nb.hpp"
using namespace tom;

char*chrtime(DWORD time,char*string,int type);

int main(int argc, char* argv[])
{
DWORD tps=GetTickCount();
char*a=new char[1000];
_uint nb1="542546524";
_uint nb2=54;
_uint nb3=nb1/nb2;
printf(" %s\n",nb1.GetString(a));
printf("/%s\n",nb2.GetString(a));
printf("=%s\n",nb3.GetString(a));
printf("+/- =10^%d\n",nb3.GetLenString());
tps=GetTickCount()-tps;
chrtime(tps,a,0);
printf("Realise en %s\n",a);
delete[]a;
}

char*chrtime(DWORD time,char*string,int type)
{
	DWORD ms=0;
	DWORD s=0;
	DWORD m=0;
	DWORD h=0;
	DWORD j=0;
	DWORD mois=0;
	DWORD sem=0;
	DWORD ans=0;
	switch(type)
	{
	case 0:
		ms=time;
		s=ms/1000;ms-=s*1000;
		m=s/60;s-=m*60;
		h=m/60;m-=h*60;
		j=h/24;h-=j*24;
		mois=j/30;j-=mois*30;
		sem=j/7;j-=sem*7;
		ans=mois/24;mois-=ans/7;
		break;
	case 1:
		s=time;
		m=s/60;s-=m*60;
		h=m/60;m-=h*60;
		j=h/24;h-=j*24;
		mois=j/30;j-=mois*30;
		sem=j/7;j-=sem*7;
		ans=mois/24;mois-=ans/7;
		break;
	case 2:
		m=time;
		h=m/60;m-=h*60;
		j=h/24;h-=j*24;
		mois=j/30;j-=mois*30;
		sem=j/7;j-=sem*7;
		ans=mois/24;mois-=ans/7;
		break;
	case 3:
		h=time;
		j=h/24;h-=j*24;
		mois=j/30;j-=mois*30;
		sem=j/7;j-=sem*7;
		ans=mois/24;mois-=ans/7;
		break;
	case 4:
		j=time;
		mois=j/30;j-=mois*30;
		sem=j/7;j-=sem*7;
		ans=mois/24;mois-=ans/7;
		break;
	case 5:
		j=time*7;
		mois=j/30;j-=mois*30;
		sem=j/7;j-=sem*7;
		ans=mois/24;mois-=ans/7;
		break;
	case 6:
		mois=time;
		ans=mois/24;mois-=ans/7;
		break;
	}
	char*tmp=new char[100];
	char*nb=new char[25];

  • tmp=0;
if(ans) { ultoa(ans,nb,10); strcat(tmp,nb); strcat(tmp,"ans"); } if(mois) { if(strlen(tmp))strcat(tmp," "); ultoa(mois,nb,10); strcat(tmp,nb); strcat(tmp,"mois"); } if(sem) { if(strlen(tmp))strcat(tmp," "); ultoa(sem,nb,10); strcat(tmp,nb); strcat(tmp,"semaines"); } if(j) { if(strlen(tmp))strcat(tmp," "); ultoa(j,nb,10); strcat(tmp,nb); strcat(tmp,"jours"); } if(h) { if(strlen(tmp))strcat(tmp," "); ultoa(h,nb,10); strcat(tmp,nb); strcat(tmp,"h"); } if(m) { if(strlen(tmp))strcat(tmp," "); ultoa(m,nb,10); strcat(tmp,nb); strcat(tmp,"min"); } if(s) { if(strlen(tmp))strcat(tmp," "); ultoa(s,nb,10); strcat(tmp,nb); strcat(tmp,"s"); } if(ms) { if(strlen(tmp))strcat(tmp," "); ultoa(ms,nb,10); strcat(tmp,nb); strcat(tmp,"ms"); } if(strlen(tmp)==0)strcat(tmp,"0ms"); strcpy(string,tmp); return string; }

Conclusion :


nb: pour ceux qui veulent comprendre le code :
le nombre 1234 et rangé sous forme d'une chaine de caractère en débutant pas les décimal,pous les dixaines,centaines... :
4321000000000000...

le "#define maxlen 1000" définit la taille max des nombre
#define maxlen n permet d'utiliser des nombre jusqu'a 10^n

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_fiend Messages postés 2 Date d'inscription lundi 14 juillet 2003 Statut Membre Dernière intervention 2 août 2003
2 août 2003 à 00:39
Génial,
Pour quand les autres oppérations(/, ^, cos, sin, tan, invcos, invsin, invtan, racine, carré,racine n-ème?
cs_dtom Messages postés 30 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 16 novembre 2003
2 août 2003 à 00:42
ca arrive bientot : je l'ai fait en 5h, ce n'est que le squellette!
mais le reste arrive d'ici peut...
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
2 août 2003 à 10:47
Bon début, ça fait plaisir de voir que certains s'intéressent au calcul en multi précision. Quelques pistes pour améliorer :
1/c'est dommage de représenter 1234 par un tableau de maxlen éléments. Pour savoir combien de chiffres contient un nombre, on peut utiliser la formule 1+E(log(n)) où n est le nombre et log le logarithme en base 2
2/ La multiplication : ton algorithme est juste mais simpliste (donc lent). Lorgne du côté de la multiplication de Fourier. Même écueil pour la mise à la puissance (pow)
3/ Garde l'idée d'une classe C++ avec surcharge des opérateurs c'est facile à manipuler par la suite
cs_dtom Messages postés 30 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 16 novembre 2003
2 août 2003 à 12:58
Re :Bon début, ça fait plaisir de voir que certains s'intéressent au calcul en multi précision :-).
1/je sais mais cela permet d'éviter de changer al taille après chaque opération et d'éviter les problèmes de débordement.
2/merci, je vais explorer cette piste :
pour la multiplication, mon algorithme est plus que sympliste : j'ai dabord fait sur un brouillon une multiplication comme on apprend à les faire en primaire!
Au fait : Quelqu'un connaitrait-il un algorithme pour la division ? (j'ai du mal à coder celui qu'on apprend en priaire(!) ? )
3/OK!
cs_GoldenEye Messages postés 527 Date d'inscription vendredi 14 septembre 2001 Statut Membre Dernière intervention 6 octobre 2008 4
2 août 2003 à 13:03
Division = multiplication par l'inverse
Là encore des algorithmes rapides existent. Google est ton ami lol

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.