Коледж алгоритмічного програмування

    Лекція Двадцять Третя (Сезон Другий)

    Двадцять третя лекція другого сезону відбудеться 5 травня о 18 годині у конференц-залі на третьому поверсі.

    Лекцію ведуть: Олександр та Мар’ян.

    Тема: Довга арифметика.

    На порядку денному:

    • Основні ідеї;
    • Елементарні операції з короткими числами;
    • Множення та ділення на довге число;
    • Вибір основи числення та вивід довгого числа;
    • Готові реалізації довгої арифметики.
    28.04.2011 | Shef | 5 коментарів

    5 коментарів to “Лекція Двадцять Третя (Сезон Другий)”

    1. PostScriptum каже:
      05.05.2011 о 20:57

      Якщо комусь цікаво, то я потестив рішення “N^3″, що було запропоноване на лекції для множення довгого на довге. Як я і передбачав, там зовсім не N^3, а N^2 навіть для найгіршого випадку (думаю, що ним є 999…999 * 999…999). Отже, множення двох таких чисел довжинами N в системі числення 1000 000 000 займало:
      N=1000: 0.087 c
      N=2000: 0.36 c
      N=5000: 2.2 c
      N=10000: 8.8 c
      N=20000: 35.6 c
      Максимальна кількість ітерацій внутрішнього циклу при i=1, j=0 складає N, але середня кількість ітерацій для всього множення – 1.999 – ніби прямує до 2 =).

      Отже, маємо чистий N^2 і без всяких проблем з відкладанням і накопиченням оверфловів.

      PS: Якщо хтось не в курсі (а таких ніби більшість), то мова йде про наступну реалізацію:
      #include
      #include

      const int L = 50000;
      const int mod = 1000000000;

      struct LVal
      {
      int v[L];
      int l;
      };

      LVal a,b;

      int max(int a, int b)
      {
      return a>b?a:b;
      }

      LVal LMul(LVal &a, LVal &b)
      {
      LVal c;

      long long x;
      int y;
      int z;
      int i,j,k;
      int carr;
      int cs = 0;

      for(i=0; i<L; i++)
      {
      c.v[i]=0;
      }

      clock_t begin=clock();

      int maxcarry = 0;

      for (i=0; i<a.l; i++)
      {
      for (j=0; j0; k++, carr++)
      for(k=i+j+1; z>0; k++)
      {
      y = c.v[k]+z;
      c.v[k]=y%mod;
      z = y/mod;
      }
      //cs+=carr;
      //maxcarry = max(maxcarry, carr);
      }
      }
      clock_t end=clock();

      //printf(”MaxCarry: %d\n”, maxcarry);
      //printf(”AvgCarry: %lf\n”, cs/(double)(a.l*b.l));
      printf(”Mult time: %lf ms\n”, (double)(end-begin)/CLOCKS_PER_SEC);
      c.l = a.l+b.l-1 + (c.v[a.l+b.l-1]>0 ? 1 : 0);
      return c;
      }

      void LPrint(LVal a)
      {
      printf(”%d”, a.v[a.l-1]);
      for (int i=a.l-2; i>=0; i–)
      {
      printf(”%09d”, a.v[i]);
      }
      }

      int main()
      {
      int testLen = 20000;
      for (int i=0; i<testLen; i++)
      {
      a.v[i]=999999999;
      b.v[i]=999999999;
      }
      a.l=testLen;
      b.l=testLen;
      printf("%d", LMul(a, b).l);

      return 0;
      }

    2. PostScriptum каже:
      05.05.2011 о 21:00

      В коді вище мабуть єж якась послідовність символів, що замість коменту зробила його жирним =). Тому перший жирний рядок, що не буде компілитись, варто закоментувати =)).

    3. admin каже:
      06.05.2011 о 00:11

      Напиши, що мало бути на місці цього рядка і я поправлю
      for (j=0; j0; k++, carr++)

    4. PostScriptum каже:
      12.05.2011 о 21:50

      Ось основний цикл, надіюсь, тепер буде без ескейпів (раніше “менше b” вважалось початком HTML-тегу) =)
      for (i=0; i < a.l; i++)
      {
      for (j=0; j 0; k++)
      {
      y = c.v[k]+z;
      c.v[k]=y%mod;
      z = y/mod;
      }
      }
      }

    5. PostScriptum каже:
      12.05.2011 о 21:54

      Ще одна невлада спроба =). Дубль 3, тепер вже точно все поескейпив =))) :
      for (i=0; i<a.l; i++)
      {
      for (j=0; j<b.l; j++)
      {
      x = a.v[i]*(long long)b.v[j] + c.v[i+j];
      c.v[i+j]=x%mod;
      z = x/mod;

      for(k=i+j+1; z>0; k++)
      {
      y = c.v[k]+z;
      c.v[k]=y%mod;
      z = y/mod;
      }
      }
      }

    Leave a Reply

    Клацніть, щоб скасувати відповідь.

    CAPTCHA Image CAPTCHA Audio
    Refresh Image
    Лекція Двадцять Четверта (Сезон Другий)
    Лекція Двадцять Друга (Сезон Другий)
     
    • Банери

    • Категорії

      • Змагання (2)
      • Лекції (149)
      • Некатегоризовано (12)
      • Розбір задач (13)
      • свято (4)
    • Архіви

      • Жовтень 2016 (1)
      • Квітень 2016 (3)
      • Березень 2016 (5)
      • Лютий 2016 (3)
      • Грудень 2015 (3)
      • Листопад 2015 (1)
      • Травень 2015 (1)
      • Квітень 2015 (4)
      • Березень 2015 (4)
      • Лютий 2015 (3)
      • Грудень 2014 (2)
      • Листопад 2014 (4)
      • Жовтень 2014 (5)
      • Вересень 2014 (1)
      • Травень 2014 (2)
      • Квітень 2014 (3)
      • Березень 2014 (3)
      • Лютий 2014 (1)
      • Грудень 2013 (3)
      • Листопад 2013 (4)
      • Жовтень 2013 (4)
      • Травень 2013 (2)
      • Квітень 2013 (4)
      • Березень 2013 (4)
      • Лютий 2013 (4)
      • Листопад 2012 (7)
      • Жовтень 2012 (2)
      • Травень 2012 (1)
      • Квітень 2012 (4)
      • Березень 2012 (5)
      • Лютий 2012 (4)
      • Грудень 2011 (3)
      • Листопад 2011 (4)
      • Жовтень 2011 (4)
      • Вересень 2011 (3)
      • Травень 2011 (2)
      • Квітень 2011 (5)
      • Березень 2011 (4)
      • Грудень 2010 (4)
      • Листопад 2010 (5)
      • Жовтень 2010 (4)
      • Вересень 2010 (3)
      • Травень 2010 (4)
      • Квітень 2010 (4)
      • Березень 2010 (6)
      • Лютий 2010 (3)
      • Січень 2010 (1)
      • Грудень 2009 (7)
      • Листопад 2009 (2)
      • Жовтень 2009 (2)
    • ACM-Контестер

      • ACM-Contester Архів задач із автоматичною системою тестування “ACM Contester”.
    • Мета

      • Зареєструватись
      • Вхід
      • RSS публікацій
      • RSS коментарів
    

    © 2026 Коледж алгоритмічного програмування is proudly powered by WordPress | Constructor Theme
    Entries (RSS) and Comments (RSS).
    Наші проекти: Контестер, _Колледж.