Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > проблема с длинной арифметикой


Автор: CppDevelopeR 9.1.2008, 17:35
Я все понимаю:тема будет перенесена в центр помощи, но я уже создал там эту тему, мне не кто не помог!!! Я прошу помощи здесь! Может здесь есть люди которые помогут мне? Мне действительно ооочень срочно! 
Здравствуйте уважаемый участники форума! Мне задали задачи на тему: "Длинная арифметика", а я в ней полный "0"! Сейчас я приведу вам список заданных мне задач. Сделайте сколько сможете, хотябы одну-две. Вот список задач:

(A) Дано чиcло n. Выведите число n+1. 
(B) Даны два числа. Выведите знак <, если первое число меньше второго, знак >, если первое больше второго или знак =, если числа совпадают. 
© Даны два числа. Выведите их сумму. 
(D) Даны два числа, второе из них не превышает первого. Выведите их разность. 
(Е) Даны два числа. Выведите их разность (учтите, что может получиться отрицательный результат). 
(F) Даны два числа, второе из них не превышает 9999. Выведите их произведение (реализуйте умножение длинного числа на короткое с основанием 10000). 
(G) Даны два числа. Выведите их произведение. 
(H) Дано одно число и число от 1 до 9. Выведите частное от деления первого на второе. 
(I) Дано одно число и число от 1 до 9. Выведите остаток от деления первого на второе. 
(J) Дано одно число и число от 1 до 9999. Выведите частное от деления первого на второе. 
(K) Дано одно число и число от 1 до 9999. Выведите остаток от деления первого на второе. 
(L) Дано два числа. Выведите частное от деления первого на второе. 
(M) Дано два числа. Выведите остаток от деления первого на второе. 
(N) Дано число N не превосходящее 3000. Выведите его факториал. 
(O) Даны два числа N и P, 1≤N≤109, 1≤P≤100. Вычислите NN mod 10P. 
(P) Дано число A. Извлеките из него квадратный корень: найдите такое наибольшее целое число X, что X2≤A. 


Я прошу, хотябы одну-две! 

Автор: bsa 9.1.2008, 17:45
Что такое "длинная арифметика"? Это числа которые не входят в диапазоны значений стандартных типов?
Для стандартных типов:
A)
Код
#include <iostream>
int main()
{
    std::cout << "Input n: " << std::flush;
    int n;
    std::cin >> n;
    std::cout << "n+1 = " << (n+1) << std::endl;
    return 0;
}
B)
Код
#include <iostream>
int main()
{
    int n1, n2;
    std::cout << "Input number1: " << std::flush;
    std::cin >> n1;
    std::cout << "Input number2: " << std::flush;
    std::cin >> n2;
    std::cout << ( (n1 < n2) ? '<' : ( (n1 == n2) ? '=' : '>') ) << std::endl;
    return 0;
}
C)
Код
#include <iostream>
int main()
{
    int n1, n2;
    std::cout << "Input number1: " << std::flush;
    std::cin >> n1;
    std::cout << "Input number2: " << std::flush;
    std::cin >> n2;
    std::cout << "n1 + n2 = " << ( n1 + n2) << std::endl;
    return 0;
}

Автор: CppDevelopeR 9.1.2008, 17:50
Это что? Решения задач?

Автор: bsa 9.1.2008, 17:51
Цитата(CppDevelopeR @ 9.1.2008,  17:50)
Это что? Решения задач?

Если бы ты ответил на мой вопрос, то я бы смог ответить на твой.

Автор: CppDevelopeR 9.1.2008, 17:52
Да ты прав! (Это ответ на твой первый вопрос)

Автор: Alek86 9.1.2008, 17:55
для большой арифметики существуют специальные библиотеки
тебе можно повыделываться и использовать одну из них - тогда задачи в пару строк каждая решаются

а если в центре помощи не помогли, значит мало предлагал за решение....

Автор: CppDevelopeR 9.1.2008, 17:58
плачу сколько угодно! мне срочно!

Добавлено через 10 минут и 36 секунд
Ну помогите же!

Автор: bsa 9.1.2008, 18:09
Цитата(CppDevelopeR @ 9.1.2008,  17:58)
плачу сколько угодно! мне срочно!
на сколько срочно и на сколько много готов платить? Тысяч за 100 рублей я готов написать хоть сегодня  smile 

Автор: CppDevelopeR 9.1.2008, 18:12
Цитата(bsa @  9.1.2008,  18:09 Найти цитируемый пост)
на сколько срочно и на сколько много готов платить? Тысяч за 100 рублей я готов написать хоть сегодня


Мде... Я думал тут могут помочь... Ошибся.... Спасибо что хотябы выслушали. Мне ведь действительно срочно!

Автор: bsa 9.1.2008, 18:14
Цитата(CppDevelopeR @ 9.1.2008,  18:12)
Мне ведь действительно срочно!

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

Автор: CppDevelopeR 9.1.2008, 18:15
на сколько? ооооооооооооооооооооооооооооооочень! 

Автор: bsa 9.1.2008, 18:16
Цитата(CppDevelopeR @ 9.1.2008,  18:15)
на сколько? ооооооооооооооооооооооооооооооочень!

очень срочно - это час. За час это не написать!

Автор: CppDevelopeR 9.1.2008, 18:18
да нет! мне хотябы типо там сумму, разность. Мне хотябы две!!!

Автор: bsa 9.1.2008, 18:26
Цитата(CppDevelopeR @ 9.1.2008,  18:18)
да нет! мне хотябы типо там сумму, разность. Мне хотябы две!!!

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

Автор: CppDevelopeR 9.1.2008, 18:27
Я конечно благодарен за совет! НО Я НИЧЕГО В ЭТОЙ ДЛИННОЙ АРФМЕТИКЕ НЕ СМЫСЛЮ! Ктонить дайте код! Все что угодно сделаю(в пределах разумного)

Автор: warmonger_ 9.1.2008, 18:27
Цитата(bsa @  9.1.2008,  17:45 Найти цитируемый пост)
std::flush;


 smile  
можно узнать что это?  smile  

Автор: Alek86 9.1.2008, 18:40
 smile 
"сбрасывает" содержимое буфера в поток.
как я понимаю, если пишешь куда-то далеко, то оно не обязательно пишется сразу туда, а может накапливаться в буфере
и, если, не дай боже, пробежала искра, то не обязательно что-то "туда" запишется
а так можно быть уверенным, что хоть что-то, да записалось

Автор: CppDevelopeR 9.1.2008, 18:41
НУ ПОМОГИТЕ ПОЖАЛУЙСТА!

Автор: Alek86 9.1.2008, 18:43
тебе уже сказали-же, что делать

а для непонимающих есть ветка форума - "Центр помощи"
предлагай (там, а не тут) нормальную компенсацию - и тебе все сделают

Автор: warmonger_ 9.1.2008, 18:45
Alek86, спасибо. буду знать

Автор: PPS05 9.1.2008, 18:52
Я не понимаю, здесь что: форум или рынок? Неужели никто не может помочь?

http://algolist.manual.ru/maths/longnum.php есть статья и исходники.

Автор: CppDevelopeR 9.1.2008, 18:53
А там есть решения задач?

Автор: bsa 9.1.2008, 18:57
Код
class Upn
{
     char *m_data;
     std::size_t m_size;
     bool m_negative;

     explicit Upn(std::size_t size) : m_data(new char[size]), m_size(size), m_negative(false) {}

     void set(const char *value) {
          delete []m_data;
          value += std::strspn(value, " \t\n\r\a");
          m_negative = false;
          if (*value == '+' )
              ++value;
          if (*value == '-' ) {
              m_negative = true;
              ++value;
          }
          m_size = std::strspn(value, "0123456789");
          if (m_size == 0) {
              value = "0";
              m_size = 1;
          }
          m_data = new char[m_size];
          for(std::size_t i = 0; i < m_size; ++i)
             m_data[i] = value[m_size - i -1] - '0';
     }
public:
     explicit Upn(const char *value = "0") : m_data(0) {
         set(value);
     }
     Upn(const Upn& value) : m_data(new char[value.m_size]), m_size(value.m_size), m_negative(value.m_negative) {
         std::memcpy(m_data, value.m_data, m_size);
     }
     ~Upn() {
          delete []m_data;
     }
     const Upn& operator+=(const Upn& value) { //без учета знака!!!
         std::size_t size = m_size;
         if (value.m_size > size)
               size = value.m_size;
         char *tmp = new char[size+1];
         std::memcpy(tmp, m_data, m_size);
         std::memset(tmp + m_size, 0, size - m_size);
         delete []m_data;
         m_data = tmp;
         m_size = size;
         char rem = 0;
         std::size_t i;
         for(i = 0; i < size; ++i) {
             char t = m_data[i] + rem + ((i < value.m_size) ? value.m_data[i] : 0);
             if (t > 9) {
                 rem = 1;
                 t -= 10;
             }
             m_data[i] = t;
             if (!rem && (i >= value.m_size) )
                 break;
         }
         if (i > m_size)
             m_size = i;
         return *this;
     }
     Upn operator+(const Upn &value) const {
           return  Upn(*this) += value;
     }
};
Это написано, что называется на коленке и требует отладки.
Кстати, эти задания уровня олимпиад по информатике 1997 года.

Автор: CppDevelopeR 9.1.2008, 19:03
bsa, Слушай! Выдает 2 ошибки:
Код

1>msvcrtd.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>C:\Documents and Settings\1\Мои документы\Visual Studio 2005\Projects\danila\Debug\danila.exe : fatal error LNK1120: 1 unresolved externals


Что это значит? Значит ли это что я работаю в Visual C++. А кстати, что вообше эта программа делает?

Автор: PPS05 9.1.2008, 19:05
Там есть готовые функции, которые осталось только вызвать в соответствии с условием.

Автор: CppDevelopeR 9.1.2008, 19:05
Цитата(PPS05 @  9.1.2008,  19:05 Найти цитируемый пост)
Там есть готовые функции, которые осталось только вызвать в соответствии с условием.


а не мог бы ты написать что именно делавть? Йа чайнег

Добавлено через 12 минут и 56 секунд
bsa, чо мне делать? Задачу сдавать через 20 минууууут!!!!!!!!!!!111

Автор: JackYF 9.1.2008, 19:35
Цитата(PPS05 @  9.1.2008,  17:52 Найти цитируемый пост)
Я не понимаю, здесь что: форум или рынок? Неужели никто не может помочь?

здесь каждый делает то, что считает нужным в пределах правил форума. Любой наезд типа "почему никто не помогает?" необоснуем. Никто здесь никому ничего не должен. Ясно выразился?

Автор: PPS05 9.1.2008, 19:43
Согласен.

Автор: bsa 9.1.2008, 20:16
Цитата(CppDevelopeR @ 9.1.2008,  19:03)
bsa, Слушай! Выдает 2 ошибки:
Код

1>msvcrtd.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>C:\Documents and Settings\1\Мои документы\Visual Studio 2005\Projects\danila\Debug\danila.exe : fatal error LNK1120: 1 unresolved externals


Что это значит? Значит ли это что я работаю в Visual C++. А кстати, что вообше эта программа делает?

Конечно выдает. Это же только класс с парой методов. К нему надо еще кучу всего дописать. Например функцию main(), на отсутсвие которой ругался компилятор.
Странно, что приходится это объяснять человеку со статусом "С++ Developer".

Автор: CppDevelopeR 9.1.2008, 20:26
А что писать то?

Автор: Doc_d0s 9.1.2008, 20:35
CppDevelopeR
стукни в асю, поговорим, может помогу

Автор: bsa 9.1.2008, 20:59
Цитата(CppDevelopeR @ 9.1.2008,  20:26)
А что писать то?

много чего.
Во-первых, надо перегрузить operator<<() для вывода в поток и operator>>() для ввода из потока данных.
Во-вторых, надо сделать operator+= чувствительным к знаку.
В-третьих, добавить вычитание (-), умножение (*), деление (/) и остаток от деления (%) аналогично сложению.
В-четвертых, добавить операторы сравнения: operator<(), operator<=(), operator>(), operator>=(), operator==()
В-пятых, перегрузить функцию std::sqrt() (квадратный корень) для работы с классом Upn.

Естественно, что все вышесказанное совершенно бесполезно делать, если у тебя нет функции main() в проекте. Именно ей передается управление после старта программы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)