Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Alex Derbeev                         2:455/2251.12  06 Sep 2001  01:03:00
 To : Misha Spitsin
 Subject : Вычислить 100!
 -------------------------------------------------------------------------------- 
 
     How are you getting on, Misha?
 
 04 Sep 01 21:58, Nickita A Startcev -> Misha Spitsin:
 
  MS>> Как сделать сабж, но пpи этом полyчить все цифpы выpажения, а не
  MS>> запись в иде 9.33e157?
  NS> Поищи школьный учебник  с подpобным описанием умножения в столбик.
  NS> ps: в системе комманд x86есть всякие "ascii correction (after) ..."
 
 Это вычислено пpи помощи GMP (GNU Multiple Precision arithmetic lib):
 === begin t ===
 93326215443944152681699238856266700490715968264
 38162146859296389521759999322995608941463976156
 51828625369792082722375825118521091686400000000
 0000000000000000
 === end t ===
 
 (еще есть "libg++, the GNU C++ class library" -> "lang/cxx/integer.h")
 
 А это из snip9707.*:
 
 === begin BIGFAC.C ===
 /* +++Date last modified: 05-Jul-1997 */
 
 /*
 **  bigfac.c -- put into the public domain by Carl Declerck
 */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #define BUFFLEN 8192
 #define BUFFER ((char *) malloc(BUFFLEN))
 
 int  main (void);
 void multiply (char *, char *, char *);
 void zero_buffer (char *);
 void minus_one (char *);
 int  isnull (char *);
 void factorial (char *);
 
 main (void)
 {
       char *g = BUFFER;
 
       printf ("Enter a number: ");
       scanf ("%s", g);
       printf ("Factorial of %s is: ", g);
       factorial (g);
       printf ("%s\n", g);
       free (g);
       return 0;
 }
 
 void multiply (char *g1, char *g2, char *g3)
 {
       int gp1, gp2, cumpos, respos, mod, div;
       int cmod, cdiv, resoff, wdig1, wdig2, base;
 
       zero_buffer (g3);
       for (gp2 = strlen(g2) - 1; gp2 >= 0; gp2--)
       {
             wdig2 = *(g2 + gp2) - 48;
             resoff = strlen(g2) - gp2 - 1;
             respos = BUFFLEN - resoff - 2;
             for (gp1 = strlen(g1) - 1; gp1 >= 0; gp1--)
             {
                   wdig1 = *(g1 + gp1) - 48;
                   mod = (wdig1 * wdig2) % 10;
                   div = (wdig1 * wdig2) / 10;
                   base = *(g3 + respos) - 48;
                   cmod = (base + mod) % 10;
                   cdiv = (base + mod) / 10 + div;
                   *(g3 + respos) = (char)(cmod + 48);
                   cumpos = --respos;
                   while (cdiv > 0)
                   {
                         base = *(g3 + cumpos) - 48;
                         *(g3 + cumpos--) = (char)((base + cdiv) % 10 + 48);
                         cdiv = (base + cdiv) / 10;
                   }
             }
       }
       for (respos = 0; *(g3 + respos) == '0'; respos++)
             ;
       strcpy (g3, (char *) (g3 + respos));
       if (*g3 == 0)
             strcpy (g3, "0");
 }
 
 void zero_buffer (char *buff)
 {
       int cnt;
 
       for (cnt= 0; cnt < BUFFLEN; cnt++)
             *(buff + cnt) = '0';
       *(buff + BUFFLEN - 1) = 0;
 }
 
 void minus_one (char *g)
 {
       int p;
       char digit;
 
       p = strlen(g) - 1;
       digit = *(g + p);
       while (digit == '0')
       {
             *(g + p--) = '9';
             digit = *(g + p);
       }
       *(g + p) -= 1;
 }
 
 int isnull (char *g)
 {
       int p, ok = 1;
 
       for (p = 0; p < (int)(strlen(g)); p++)
             if (*(g + p) != '0')
                   ok = 0;
       return (ok);
 }
 
 void factorial (char *g)
 {
       char *h1 = BUFFER, *h2 = BUFFER;
 
       strcpy (h1, "1");
       while (!isnull(g))
       {
             multiply (h1, g, h2);
             strcpy (h1, h2);
             minus_one (g);
       }
       strcpy (g, h1);
       free (h1);
       free (h2);
 }
 
 /*
 **  The principal function is multiply(), it 'multiplies' two
 **  character-strings of arbitrary length and puts the result
 **  into a third.  8192 bytes is enough for 1000!, beyond that
 **  the buffer-size may need to be incremented.
 */
 === end BIGFAC.C ===
   // Alex [#БГУИР#] [#КСиС#]
 
 ... Beneath my wing it's gonna be alright
 --- Fregate 1.52/W32
  * Origin: GNU Project BBS (2:455/2251.12)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Вычислить 100!   Misha Spitsin   03 Sep 2001 22:18:57 
 Вычислить 100!   Max Alekseyev   03 Sep 2001 17:37:14 
 Re: Вычислить 100!   Sergey Goltsov   04 Sep 2001 13:09:47 
 Вычислить 100!   Nickita A. Startcev   04 Sep 2001 22:58:06 
 Вычислить 100!   Alex Derbeev   06 Sep 2001 01:03:00 
 Re: Вычислить 100!   Alexey Desyatnik   06 Sep 2001 13:40:28 
 Вычислить 100!   Victor Bazhenov   05 Sep 2001 15:00:52 
 Re: Вычислить 100!   Yuri Kostylev   13 Sep 2001 10:26:10 
 Вычислить 100!   Andrew Kuksov   05 Oct 2001 19:45:05 
Архивное /ru.algorithms/38822b26129d.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional