Автор Тема: Very long int - C++  (Прочетена 5847 пъти)

borovaka

  • Напреднали
  • *****
  • Публикации: 1331
  • Distribution: Каквото дойде
  • Window Manager: Gnome / KDE
    • Профил
Re: Very long int - C++
« Отговор #15 -: Oct 25, 2010, 23:01 »
victim70 Ограничението е: Матрицата трябва да е с големина най-много 1000 реда и 100 колони.
Ограничението на числата които са въвеждат е да са от тип int без значение от знака значи не може да се използва unsigned.
Активен

Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: Very long int - C++
« Отговор #16 -: Oct 25, 2010, 23:07 »
Ако числата могат да бъдат отрицателни тогава ще трябва да ги третираш по някакъв друг начин, логаритъм от отрицателно реално число не е дефиниран. Също и нулата трябва да се третира отделно, ама тогава е лесно, щото каквото и да умножиш по нула е все нула.
при отрицателни числа мунис може да се изнесе пред логаритъма и минусите да се умножават (логаритмите събират). А за нулата просто се спира по-нататъшното смятане като безсмислено :)

victim70 Ограничението е: Матрицата трябва да е с големина най-много 1000 реда и 100 колони.
Ограничението на числата които са въвеждат е да са от тип int без значение от знака значи не може да се използва unsigned.
аз съм го правил на асемблер на Правец 82 само че за числата на Фибоначи, само че си е мъка от където и да го погледнеш. да не фоворим че работата с подобни числа се лимитира от паметта.
А 32к за число и 1000 реда е скромното 2^15000. Трудно може да се каже че оперирането с подобни числа е удобно :)
Активен

0x2B|~0x2B

borovaka

  • Напреднали
  • *****
  • Публикации: 1331
  • Distribution: Каквото дойде
  • Window Manager: Gnome / KDE
    • Профил
Re: Very long int - C++
« Отговор #17 -: Oct 25, 2010, 23:21 »
Тя ако беше лесна задачката нямаше да я дадат на състезание по програмиране :)
Май най-лесно ще стане със разлагането на числата на прости множители и събиране на степените на множителите им. Като цялата тази работа се записва в масив и след това да се сравняват масивите за всеки 2 колони.
Активен

Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: Very long int - C++
« Отговор #18 -: Oct 25, 2010, 23:29 »
Тя ако беше лесна задачката нямаше да я дадат на състезание по програмиране :)
Май най-лесно ще стане със разлагането на числата на прости множители и събиране на степените на множителите им. Като цялата тази работа се записва в масив и след това да се сравняват масивите за всеки 2 колони.
не е толкова просто, представи си ситуацията:
2**4*3**1 т.е. степени 4 и 1
2**1*3**2 т.е. степени 1 и 2

как ще сметнеш (просто) кое е по-голямо?
Активен

0x2B|~0x2B

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Very long int - C++
« Отговор #19 -: Oct 25, 2010, 23:30 »
Нях, сериозно аз бих си написал няколко функции за превръщане на int стойности във/умножение/сравнение на големи числа, представени като низове. Въобще не е толкова някакъв rocket science цялата работа. Поне не и докато не се появи деление, което обаче в случая няма да се случи.

 
Активен

"Knowledge is power" - France is Bacon

borovaka

  • Напреднали
  • *****
  • Публикации: 1331
  • Distribution: Каквото дойде
  • Window Manager: Gnome / KDE
    • Профил
Re: Very long int - C++
« Отговор #20 -: Oct 25, 2010, 23:31 »
gat3way Я кажи как става номера с представянето като низове.
Активен

Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Very long int - C++
« Отговор #21 -: Oct 25, 2010, 23:36 »
Обръщането на int в низ е елементарно - sprintf().

Умножението става точно както става на хартия в училище. Единствено ти трябва една табличка, която да ти match-ва число от 0...9 към ascii стойност.  Сравнението става също толкова елементарно - в ascii таблицата, цифрите 0..9 са наредени както трябва.
Активен

"Knowledge is power" - France is Bacon

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: Very long int - C++
« Отговор #22 -: Oct 25, 2010, 23:43 »
Обръщането на int в низ е елементарно - sprintf().

Умножението става точно както става на хартия в училище. Единствено ти трябва една табличка, която да ти match-ва число от 0...9 към ascii стойност.  Сравнението става също толкова елементарно - в ascii таблицата, цифрите 0..9 са наредени както трябва.
даже и ASCII не ти е нужно, просто записваш от 0 до 9 като число във всеки байт и си ги събираш, изваждаш, умножаваш като само следиш за >9
Така минаваш без таблицата
Активен

0x2B|~0x2B

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Very long int - C++
« Отговор #23 -: Oct 25, 2010, 23:49 »
Може :)

Аритметиката също е лесна (има една забавна особеност, че нещата растат наобратно и това създава главоболие с динамично заделена памет или масиви....умният човек ще се сети как да реши този проблем).

Всичко това е ако няма делене. Деленето усложнява ужасно много цялата тази работа. В случаят обаче няма делене и не виждам нищо лошо да си направиш сам.....ъммм това което го правят разни библиотеки като GMP.
Активен

"Knowledge is power" - France is Bacon

arda_kj

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian Sid/Unstable; Ubuntu 12.04
  • Window Manager: Gnome/KDE
    • Профил
Re: Very long int - C++
« Отговор #24 -: Oct 26, 2010, 12:19 »
Ако числата могат да бъдат отрицателни тогава ще трябва да ги третираш по някакъв друг начин, логаритъм от отрицателно реално число не е дефиниран. Също и нулата трябва да се третира отделно, ама тогава е лесно, щото каквото и да умножиш по нула е все нула.
при отрицателни числа мунис може да се изнесе пред логаритъма и минусите да се умножават (логаритмите събират). А за нулата просто се спира по-нататъшното смятане като безсмислено :)

Вярно че така може да се избегне проблема с минусите, добра идея :). Ами значи проблема с минусите е решен, остава borovaka да хвани и да го реализира, едва ли е повече от ден работа - писане и тестване. Само че той май тръгна по по-трудния начин.

@borovaka значи какво правиш ако решиш да реализираш с логаритми - първоа двете сравнявани колони търсиш отрицателни числа, ако са четен брой отриц. числа значи целия резултат от умножението ще е положителен ако са нечетен, резултата ще е отрицателен, Същото правиш за втората колона и ако двевте колони са с нечетен брой минуси и няма нулеви членове, тогава ги сравняваш, ако една от колоните е положителна и няма нули в нея то тя автоматично е по-голяма от отрицателната колона. Оттам като разбереш ква е колоната отрицателна или положителна, прилагаш логаритъм от абсолютната стойност на всяко число.
Сега като се замисля трябва също да измислиш как ще третираш случаите, когато N на брой от колоните са с равни стойности, тогава няма как да кажеш тая колона е по-голяма от оная колона.
Активен

Debian Sid/Unstable; Ubuntu 12.04
"За да открием истината, е нужно поне веднъж в живота си да подложим всичко на съмнение" - Р. Декарт

arda_kj

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian Sid/Unstable; Ubuntu 12.04
  • Window Manager: Gnome/KDE
    • Профил
Re: Very long int - C++
« Отговор #25 -: Oct 27, 2010, 03:33 »
Момци :), аз май взех, че я направих тая програма. Стана ми интересно да я реализирам с логаритмите и взех, че тая вечер я написах.

Кво прави програмата:
1) При стартиране програмата чете от Input.dat файла броя на редовете и колоните;
2) Изписва един report с инфо за потребителя и същия report се записва във лог файл matrix.log;
3) Попълва матрицата със случайни цели положителни числа;
4) Принтира на екрана матрицата;
5) После умножава числата във всяка колона чрез събиране на логаритми с отчитане на знака +/-;
6) Намира най-голямата колона;
7) Печата на екрана логаритмите от всички колони като показва най-голямата колона/колони с големи букви;
8) Принтира размера на матрицата;

Прикачвам файла със сорс кода и компилираната програма, който иска да ги разгледа и да си играе.
Активен

Debian Sid/Unstable; Ubuntu 12.04
"За да открием истината, е нужно поне веднъж в живота си да подложим всичко на съмнение" - Р. Декарт

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Long live openSuSE
Коментар
Vatman 0 1737 Последна публикация Nov 13, 2009, 10:02
от Vatman
mount.nfs: Argument list too long
Настройка на програми
sash 26 5798 Последна публикация Jan 21, 2012, 21:55
от ieti
Проблем с long long conversion to binary (std C99/ 32bit PC)
Общ форум
kifavi8024 7 2585 Последна публикация Dec 03, 2012, 23:07
от kifavi8024