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


Автор: Splendid 13.6.2008, 14:29
Если не сложно - помогите, пожалуйста....Нужно переписать этот код
Код

#include <iostream>
using namespace std;
//Алгоритм Евклида (для нахождения НОД)

int Evcl(int a, int b) {
  int c;
  while (b) {
     c = a % b;
     a = b;
     b = c;        
  }
 return abs(a);
}

int main()
{
    
    cout << "Enter any number -> ";
     long a;
    cin >> a;
        cout << "Enter any number -> ";
     long b;
    cin >> b;
    cout << (Evcl(a, b)) << endl;
    
    cin.get();
    cin.get();

    return 0;
}




для больших чисел с использованием следующей библиотеки:
Код





Тыкаюсь, как слепой котенок и не знаю, что с этим делать...ПОМОГИТЕ, пожалуйста!!!!! 

Автор: andrew_121 13.6.2008, 14:32
Splendid - Ты про класс complex слышал?
Ну вот, погугли.

И еще момент... А для чего такие числа применяються??? Разве double не хватает, 64 бита.
Или long double - 100 бит.

Возьми класс complex, замени его типы на long double и будет у тебя класс 200 битного числа.

А на* такие числа?

Автор: Splendid 13.6.2008, 14:35
Погуглила, там все ссылки на английском, а я, к сожалению его не знаю....по идее, там все просто должно быть, написано ведь все, только я туплю....

Автор: andrew_121 13.6.2008, 14:39
Цитата(Splendid @ 13.6.2008,  14:35)
Погуглила, там все ссылки на английском, а я, к сожалению его не знаю....по идее, там все просто должно быть, написано ведь все, только я туплю....

Ой...простите...Вы Мадам... smile 

Автор: Splendid 13.6.2008, 14:41
andrew_121, ага, может тогда снизойдете и поможете? smile  smile

Добавлено через 1 минуту и 28 секунд
Числа нужны для реализации алгоритма проверки простоты числа для криптографических нужд, поэтому нужны очень большие числа...

Автор: andrew_121 13.6.2008, 15:14
Цитата(Splendid @  13.6.2008,  14:41 Найти цитируемый пост)
нужны очень большие числа

Сколько бит?

Автор: Splendid 13.6.2008, 15:18
до 32768

Добавлено через 1 минуту и 26 секунд
чт. можно было представить любое целое число в диапазоне от -(2 в степ.32768)-1 до (2 в степ 32768) -1

Автор: andrew_121 13.6.2008, 15:22
Цитата(Splendid @  13.6.2008,  15:18 Найти цитируемый пост)
в диапазоне от -(2 в степ.32768)-1 до (2 в степ 32768) -1

Гм... А сколько это бит? Мне нужно знать!

Автор: Splendid 13.6.2008, 15:23
до 32768 бит

Автор: andrew_121 13.6.2008, 15:27
Так это 1024 32-ух битных.
Щас...

Добавлено @ 15:34
Код

  int c;
  while (b) {
     c = a % b;
     a = b;
     b = c; // для чего b присваивать значение, если нон больше не используеться???
  }
 return abs(a);
}

Автор: Splendid 13.6.2008, 15:42
это алгоритм Евклида такой - не я его придумалаsmile

ну вот я пытаюсь писать, но выдает ошибки:
Код



--------------------Configuration: big - Win32 Debug--------------------
Linking...
big.obj : error LNK2001: unresolved external symbol "long __cdecl big_GCD(struct big_number,struct big_number,struct big_number *)" (?big_GCD@@YAJUbig_number@@0PAU1@@Z)
big.obj : error LNK2001: unresolved external symbol "long __cdecl big_input(void const *,long,long,struct big_number *)" (?big_input@@YAJPBXJJPAUbig_number@@@Z)
Debug/big.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

big.exe - 3 error(s), 0 warning(s)

Автор: andrew_121 13.6.2008, 15:50
unresolved external - Означает, что компилер не видит реализацию функции.
А вот этот файлик добавьте к проекту. Но не через #include
Код

//#include "big_number.cpp"


Добавлено через 4 минуты и 42 секунды
Цитата(Splendid @  13.6.2008,  15:42 Найти цитируемый пост)
это алгоритм Евклида такой - не я его придумала

Жаль, у вас бы получилось лучше. )))

Автор: Splendid 13.6.2008, 15:56
о, тогда компилится, но выдает окошко - 

big.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.

Добавлено через 3 минуты и 23 секунды
Цитата(andrew_121 @  13.6.2008,  15:50 Найти цитируемый пост)
Но не через #include

 а как?

Автор: andrew_121 13.6.2008, 15:59
Цитата(Splendid @ 13.6.2008,  15:56)
о, тогда компилится, но выдает окошко - 

big.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.

Ошибка при доступе к памяти. Бывает.

Автор: Splendid 13.6.2008, 16:00
Цитата(andrew_121 @  13.6.2008,  15:50 Найти цитируемый пост)
Жаль, у вас бы получилось лучше. )))


О да!!!!smile))))))))))

Добавлено через 28 секунд
Цитата(andrew_121 @  13.6.2008,  15:59 Найти цитируемый пост)
Ошибка при доступе к памяти. Бывает. 


А что с ней делать????

Автор: andrew_121 13.6.2008, 16:03
Вот такой вариант нашел:
Код

// фукнция получения НОД
int NOD(int a, int b)
{
// пока числа не равны 0
while(a!=0 && b!=0)
{
if(a>=b) a=a%b;
else b=b%a;
}
return a+b; // Одно - ноль
}


Автор: Splendid 13.6.2008, 16:08
andrew_121, ага, спасибо. Тока это ж ничего не меняет - все равно он не для больших чисел

Автор: andrew_121 13.6.2008, 16:09
Вот что:
Код

#include <iostream>
#include "big_number.h"
//#include "big_number.cpp"
using namespace std;

int main()
{
big_number a, b, c;    
char i[20]={0x23,0x34,0x45,0x67};
big_input(i,1,4,&a);
char j[20]={0x23,0x34,0x45,0x67};
big_input(j,1,4,&b);
    cout << (big_GCD(a,b,&c)) << endl;
    
    cin.get();
    cin.get();

    return 0;
}

Автор: Splendid 13.6.2008, 16:14
тогда так::(
Код

big.obj : error LNK2001: unresolved external symbol "long __cdecl big_GCD(struct big_number,struct big_number,struct big_number *)" (?big_GCD@@YAJUbig_number@@0PAU1@@Z)
big.obj : error LNK2001: unresolved external symbol "long __cdecl big_input(void const *,long,long,struct big_number *)" (?big_input@@YAJPBXJJPAUbig_number@@@Z)
Debug/big.exe : fatal error LNK1120: 2 unresolved externals

Автор: georain 13.6.2008, 16:29
Цитата(Splendid @  13.6.2008,  15:56 Найти цитируемый пост)
big.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства.

Я просто ржал!

Автор: pan2004 13.6.2008, 16:38
Цитата(andrew_121 @  13.6.2008,  14:32 Найти цитируемый пост)
Возьми класс complex, замени его типы на long double и будет у тебя класс 200 битного числа.

Судя по приведенным выше исходникам, нужно использовать большие целые числа. Заменять их плавающей точкой нельзя - практически все арифметические операции double float и тп не дают математически точного результата, да и хранятся  они в памяти в виде приближенных значений..
А насчет complex я реально не понял - это же комплексные числа, представляемые в виде a+bi, имеют например совершенно отличающиеся операции */ даже от просто double чисел - как они могут заменить целочисленные?

Добавлено через 2 минуты и 41 секунду
Цитата(Splendid @  13.6.2008,  16:14 Найти цитируемый пост)
тогда так::(

Он говорит, что не может найти тела перечисленных функций. Подключи поставляемый вместе с библиотекой *.lib файл(если используется MS VC) - как это делается, смотри в настройках проекта

Автор: andrew_121 13.6.2008, 17:10
pan2004 - Класс complex - это же класс. Перегружаешь операторы...и вот...чудо )))

Автор: Ln78 13.6.2008, 17:24
Splendid, c самого начала: что у Вас есть и что удалось сделать? Т.е. библиотека чем представлена: файлами *.h, *.lib, *.dll, *.cpp? Каким компилятором (IDE) пользуетесь? В чём сложность: создании проекта, использовании библиотеки вообще, использование данной конкретной библиотеки? Что удалось сделать? Уточните, чтобы перейти к следующему шагу решения.

andrew_121, желание помочь - похвально. Особенно, когда за этим стоит нечто большее, чем просто выдача не относящейся к делу и неверной информации.

Автор: pan2004 13.6.2008, 17:57
Цитата

pan2004 - Класс complex - это же класс. Перегружаешь операторы...и вот...чудо )))

Проще написать с нуля свой, чем наследоватся от этого совершенно левого класса

Автор: andrew_121 13.6.2008, 18:41
Цитата(pan2004 @  13.6.2008,  17:57 Найти цитируемый пост)
Проще написать с нуля свой, чем наследоватся от этого совершенно левого класса

А я и не предлагал наследовать.

Автор: Splendid 1.7.2008, 13:39
Спасибо большое всем за помощь - я разобралась!

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