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];
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
2 août 2003 à 00:39
Pour quand les autres oppérations(/, ^, cos, sin, tan, invcos, invsin, invtan, racine, carré,racine n-ème?
2 août 2003 à 00:42
mais le reste arrive d'ici peut...
2 août 2003 à 10:47
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
2 août 2003 à 12:58
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!
2 août 2003 à 13:03
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.