Перейти к содержимому
DimaZCOM

Программа "МегоКалькулятор"

Рекомендуемые сообщения

Описание: Нужен калькулятор, способный перемножить некое число длинной до 2 цифр на число с 300000000 знаков после запятой.

 

Награда: В зависимости от качества выполнения задания колеблется от 16 алмазов до 1000000$(возможен торг)

 

Установка: Сервер 3 уровня с т3 процессором и 4096 кб оперативки (в случае если прога будет на луа); 2,4Ггц на 2 ядра и 2 гб оперативной памяти(если прога будет под WinXP 32-bit) 

 

Требования: единственное требование-что бы работало адекватно и без багов и ошибок в подсчете.

 

 

Изменено пользователем DimaZCOM

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

у тебя оперативы на игровом компе не хватит. Да и обычному не сильно легко это будет сделать :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

у тебя оперативы на игровом компе не хватит. Да и обычному не сильно легко это будет сделать :)

я это уже осознал, но реальный комп по идее должен смочь, я только прошу прогу, которая теоретически могла бы это сделать.По идее больше гига оперативы данный подсчет занять не должен, либо я чего-то не знаю.

 

Изменено пользователем DimaZCOM

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ты найди для начала тип числа, который сможет столько знаков.... я такого не знаю :)

  • Нравится 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Нужен калькулятор, способный перемножить некое число длинной до 2 цифр на число с 300000000 знаков после запятой.
Слишком неопределенная задача. Каким образом будет вводиться в компьютер число? И куда оно должно выводиться? И в каком формате осуществляется ввод-вывод?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

нужно много unsigned long long intов

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Каким образом будет вводиться в компьютер число? И куда оно должно выводиться? И в каком формате осуществляется ввод-вывод?

Думаю, входные данные (как минимум второе число) программа должна брать из текстового файла. Не с клавиатуры же его вводить. И результат сохранять тоже в файл.

К стати, совсем не обязательно загружать все число в оперативку целиком. Считывать, умножать и сохранять можно по одной циферке. Если б не ограничение по размеру жесткого диска, думаю и ОС-компьютер справился бы. Долго бы считал, но справился.

Изменено пользователем Zer0Galaxy
  • Нравится 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Думаю, входные данные (как минимум второе число) программа должна брать из текстового файла. Не с клавиатуры же его вводить. И результат сохранять тоже в файл.
 Возможно. Но условия слабо определены.

Важно знать формат: двоичный, или текстовый. Также важен порядок: старшие или младшие разряды идут первыми. Задействована ли десятичная точка, и как она кодируется. При определенных условиях необязательны и файлы и тем более огромный буфер в памяти. Можно вообще через стандартный ввод-вывод работать, подавая и принимая данные через пайпы. Также интересно, каким образом получено само длинное число. Возможно, имеет смысл изменить алгоритм его генерации для ускорения последующей работы с ним.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Нужен калькулятор, способный перемножить некое число длинной до 2 цифр на число с 300000000 знаков после запятой

Зачем?

Даже я на такие масштабы не замахивался со своими экспериментами.

Что ты будешь делать с полученными данными? Рукаблудничать пролистывая длинную кучу цифр?

 

Сначала придумай применение и цель создания такого калькулятора. Те кто на рекорд идут вычисляя число Пи - используют мощный ЭВМ. Так что побить рекорд на домашнем ПК никак не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Даже я на такие масштабы не замахивался

А я думал вы вместе работаете

Изменено пользователем Zer0Galaxy
  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А я думал вы вместе работаете

Если я и буду делать калькулятор подобный, который собирался, то не стану рассчитывать на столь огромные числа и столь большую точность.

3*10^8 знаков после запятой - это слишком большое число. Особенно для lua.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если я и буду делать калькулятор подобный, который собирался, то не стану рассчитывать на столь огромные числа и столь большую точность. 3*10^8 знаков после запятой - это слишком большое число. Особенно для lua.

А какая нам разница, слишком или не слишком? Задачка интересна тем, что при своей простоте демонстрирует ценность оптимизации кода.

 

DimaZCOM, а что тебе мешает самому написать решение? Ты же каким-то образом смог посчитать число Пи, если я ничего не путаю. И умножение его на двузначное число тоже не будет сложным. Алгоритм умножения столбиком одинаково работает для чисел любой длины.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Зачем?

Даже я на такие масштабы не замахивался со своими экспериментами.

Что ты будешь делать с полученными данными? Рукаблудничать пролистывая длинную кучу цифр?

 

Сначала придумай применение и цель создания такого калькулятора. Те кто на рекорд идут вычисляя число Пи - используют мощный ЭВМ. Так что побить рекорд на домашнем ПК никак не получится.

Я и не иду на рекорд, просто у меня уже есть способ подсчета констант до такой точности, теперь нужен способ их использования в формулах)

 

А какая нам разница, слишком или не слишком? Задачка интересна тем, что при своей простоте демонстрирует ценность оптимизации кода.

 

DimaZCOM, а что тебе мешает самому написать решение? Ты же каким-то образом смог посчитать число Пи, если я ничего не путаю. И умножение его на двузначное число тоже не будет сложным. Алгоритм умножения столбиком одинаково работает для чисел любой длины.

Я в луа слишком нуб, а другими языками до такой степени пользоваться не умею, умел бы, не просил бы)

 

 Возможно. Но условия слабо определены.

Важно знать формат: двоичный, или текстовый. Также важен порядок: старшие или младшие разряды идут первыми. Задействована ли десятичная точка, и как она кодируется. При определенных условиях необязательны и файлы и тем более огромный буфер в памяти. Можно вообще через стандартный ввод-вывод работать, подавая и принимая данные через пайпы. Также интересно, каким образом получено само длинное число. Возможно, имеет смысл изменить алгоритм его генерации для ускорения последующей работы с ним.

 

 

 Число получено методом Чудновского и хранится в виде длинного числа в десятичной системе(десятичная точка присутствует).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Я и не иду на рекорд, просто у меня уже есть способ подсчета констант до такой точности, теперь нужен способ их использования в формулах)

 

Я в луа слишком нуб, а другими языками до такой степени пользоваться не умею, умел бы, не просил бы)
Что-то я запутался. Ты не хочешь сам писать умножение, а значит, задача не учебная. Тогда какова ее практическая ценность? Что ты хочешь получить в конечном итоге?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то я запутался. Ты не хочешь сам писать умножение, а значит, задача не учебная. Тогда какова ее практическая ценность? Что ты хочешь получить в конечном итоге?

Я хочу получить калькулятор, способный перемножать значение с 3*10^8 знаками после запятой на число до 2 знаков, но в программировании для таких масштабов еще нуб, по-этому прошу вас.В инете подобного не нашел, а обычные калькуляторы не справились с объемом числа и отказались его принимать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я хочу получить калькулятор, способный перемножать значение с 3*10^8 знаками после запятой на число до 2 знаков, но в программировании для таких масштабов еще нуб, по-этому прошу вас.В инете подобного не нашел, а обычные калькуляторы не справились с объемом числа и отказались его принимать.

Твой комп не справиться, если использовать метод столбиком - тогда количество памяти будет колоссальное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Твой комп не справиться, если использовать метод столбиком - тогда количество памяти будет колоссальное.

Уже почти справился, я нашел самый упоротый способ, правда скорость подсчета ниже в 4 раза, чем при подсчете методом Чудновкого, но хоть что-то)

Изменено пользователем DimaZCOM

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, раз никто мне не верит, что затраты на память очень малы, то курите код:

local mul = "99"
local src = "123456789123456789123456789123456789123456789123456789123456789123456789"
local dst = ""

local char = string.char

local mL = #mul
local sL = #src
-- local dL = #src + #mul
-- dst = string.rep( " ", dL )
local m = tonumber(mul)

local buf,d=0
for i=sL,1,-1 do
  buf = buf + m*(src:byte(i)-48)
  d = buf%10
  buf = (buf-d)/10
  dst = char(48+d)..dst
end
for i=1,mL do
  d = buf%10
  buf = (buf-d)/10
  dst = char(48+d)..dst
end

print( "mul=" .. mul )
print( "src=" .. src )
print( "res=" .. dst )
print()
print( "chk="..tostring( tonumber(mul)*tonumber(src) ))
Осталось лишь заменить строки на файлы. При таком расположении разрядов придется на каждом шаге выставлять нужную позицию в файле, что крайне неэффективно. С этим можно бороться, организовав буферы как для чтения, так и для записи. А можно сменить направление и располагать разряды чисел от младших к старшим, что позволит работать стандартным вводом-выводом даже через пайпы.

 

Еще надо добавить обработку десятичной точки, но на расход памяти заметным образом это не повлияет, и такие числа возможно обсчитать даже на компах OpenComputers, если бы жесткие диски позволили их вместить.

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, раз никто мне не верит, что затраты на память очень малы, то курите код:

К стати, совсем не обязательно загружать все число в оперативку целиком. Считывать, умножать и сохранять можно по одной циферке. Если б не ограничение по размеру жесткого диска, думаю и ОС-компьютер справился бы. Долго бы считал, но справился.

 

 

Не понятно назначение вот этого куска кода

for i=1,mL do
  d = buf%10
  buf = (buf-d)/10
  dst = char(48+d)..dst
end

Я бы сделал просто

if buf>0 then
  dst = tostring(buf)..dst
end
Изменено пользователем Zer0Galaxy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Буферизацию по любому нужно делать, hhd самая медленная часть пк, большую часть время процессор будет ждать байтики.

 

local dL = #src + #mul
local dL = mL + sL

Может так сделать.

Изменено пользователем Fingercomp
Форматирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...