bon je me suis collé au probleme en utilisant les infos de SPH 
SPH a écrit :On procede comme une multiplication sur le papier :
ABCDEFG
* X
=======
et en n'utilisant QUE le purebasic 
SPH a écrit :Je viens d'essayer entièrement en PB mais impossible !! Et si je reussi, ca fera trop de détours pour trop de perte de temps de calcul...
si! si! c'est possible 
voici le code que je viens de mettre au point , qui reprend le mécanisme d'une multiplication a la main (multiplication +addititon) , ce qui évite de manipuler des gros chiffres
mais peut obtenir de tres grand nombres !
pour se faire j'emploie les Strings 

 car elle sont illimitées ,on peut écrire 3 tomes de chiffres dedans.. pas de problèmes 
le code si dessous utilise 2 procédures
une, qui multiplie , puis l'autre, qui est utilisée par la première , qui s'occupe de la longue addition
de cette multiplication...
tout a fait dans l'esprit de cette image :
TTTTTTTTT ; nombre a multiplier
RRRRRRRRRR ; nombre multiplicateur
=========
eeeeeeeeee   addition
eeeeeeeeee   addition
eeeeeeeeee   addition
eeeeeeeeee   addition
___________
Resultat
le code ci dessous calcul la factoriel de 200
mais surtout l'affiche !! 
sinon un exemple d'utilisation de multiplication standard est proposé sous la forme
  
 
 ; *********** exemple d'utilisation de la  multiplication **********  
b.s=  "92245"     ; ce nombre va etre multiplié par  
multiplicateur.s=  "9229"      ; celui ci ;o)  
calldebugger
   debug    multiplication(multiplicateur.s,b.s)  ; affiche le resultat : o)  
 ; *****************************************************  
 
 
Avantage , on est plus limité par la taille des nombres a multiplier 
   
declare.s multiplication(multiplicateur.s,b.s)
declare.s addition_liste(long_maximale.q) 
 ; ; *********** exemple d'utilisation de la  multiplication **********²  
b.s=  "92233720369223372036"     ; ce nombre va etre multiplié par  
multiplicateur.s=  "92233720369223372036"      ; celui ci ;o)  
   debug    multiplication(multiplicateur.s,b.s)  ; affiche le resultat : o)  
calldebugger
 ; ; *****************************************************  
 ; ************** calcul de factoriel ******************  
valeur_max=20
res.s=   "1"   
   for    i=1    to    valeur_max
        i$=   str   (i)
        res.s=multiplication(res.s,i$) 
   next    i
   debug    res.s
calldebugger
 ; *****************************************************  
   procedure.s    multiplication(multiplicateur.s,b.s)
         ; By Dobro  
           if       len   (multiplicateur.s)>len(b.s)
                buf.s=multiplicateur.s
                multiplicateur.s=b.s
                b.s= buf.s
           endif    
           global       newlist    pile.s()
        
        multiplicateur.s=    reversestring   (multiplicateur.s)
        b.s=    reversestring   (b.s)
        long_multiplicateur.q=   len   (multiplicateur.s)
        long_b.q=   len   (b.s) 
        
        i_multiplicateur.q=0
           while    i_multiplicateur.q < long_multiplicateur.q
                i_multiplicateur.q =i_multiplicateur.q +1
                extrait_multiplicateur.q=   val   (   mid   (multiplicateur.s,i_multiplicateur,1))  ; recup l'extrait du nombre multiplicateur  
                i_b=0
                   while    i_b < long_b
                        i_b=i_b+1
                        extrait_b=   val   (   mid   (b.s,i_b,1)) ;  ; recup l'extrait du nombre b  
                         ; ************ multiplie *****************   
                        resultat.s=resultat.S+   str   (extrait_b*extrait_multiplicateur+retenue) :retenue=0
                        resultat.s=   reversestring   (resultat.s)
                         ; *************************************   
                        retenue=   val   (   mid   (resultat.s ,2,1)) : reste=   val   (   mid   (resultat.s ,1,1))  
                        resultat.s=  ""    
                        ligne_provisoire$=ligne_provisoire$+   str   (reste)  
                   wend   
                
                
                   if    retenue<>0  ; ya une retenue !  
                        ligne_provisoire$=ligne_provisoire$+   str   (retenue)
                           addelement   (pile())  ; on pose la  rangée en cours  
                        pile()=ligne_provisoire$
                        retenue=0:reste=0
                         ;ligne_provisoire$=""  
                   else     ; pas de retenue  
                           addelement   (pile())  ; on pose la  rangée en cours  
                        pile()=ligne_provisoire$
                        retenue=0:reste=0 
                   endif    
                   if    long_b.q<2    and    long_multiplicateur.q<2  ; ressort le calcul simple tout de suite  
                           addelement   (pile())
                        pile()=ligne_provisoire$
                        resultat.s=   reversestring   (pile())
                        ligne_provisoire$=   ""   
                           ProcedureReturn    resultat.s
                   else     ; **********************************************************************   
                         ;on passe a la rangée suivante  
                           nextelement   (pile()) 
                         ; ajout d'un zero   
                        compt.q=compt.q+1
                        resultat.s =    lset   (resultat.s, compt.q,  "0"   ) 
                        ligne_provisoire$=resultat.s
                   endif    
           wend   
        
           if    compt.q>0 
                   lastelement   (pile())
                long_maximale.q=   len   (pile()) 
                   resetlist   (pile()) 
                total.s=addition_liste(long_maximale.q) 
                total.s=   reversestring   (total.s)
                   ProcedureReturn    total.s
           endif    
   endprocedure   
   procedure.s    addition_liste(long_maximale.q) 
         ; by dobro   
        ligne_provisoire$=   ""   
        i.q=0
           while    i.q<long_maximale.q 
                i.q=i.q+1
                   ForEach    pile() 
                        extrait_bit= extrait_bit+   val   (   mid   (pile(), i,1))+retenue :retenue=0
                   next     ; fin de l'addititon ligne  
                ligne_provisoire$= ligne_provisoire$+   right   (   str   (extrait_bit),1)
                retenue=   val   (   left   (   str   (extrait_bit),   len   (   str   (extrait_bit))-1)) 
                total.s=ligne_provisoire$
                extrait_bit=0
           wend   
           ProcedureReturn    total.s
   endprocedure   
 
 
 