Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
oks1d
4 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 91
#1

Biginteger и переменная - C++

18.12.2013, 17:06. Просмотров 989. Ответов 11
Метки нет (Все метки)

Например есть такое :
C++
1
2
3
4
5
6
#include "BigIntegerLibrary.hh"
    
    BigInteger a = 65536;
    cout << (a * a * a * a * a * a * a * a);
    
    (prints 340282366920938463463374607431768211456)
Мне необходимо объявить переменную и приравнять к 0, чтобы задать ей позже какое-то значение, (а в примере выше ей сразу присваивается значение), чтобы задать ей позже какое-то значение,
напримеp:
Biginteger a=0;

Компилятор VS12 ругается, пишет
error: Не существует подходящей функции преобразования из Biginteger в int
Тогда какого типа должна быть переменная??? Мне придется присваивать ей большие значения,но сначало как-то надо же её объявить . Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2013, 17:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Biginteger и переменная (C++):

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0; } /* foo.cpp */

BigInteger - C++
скачал эту либу для работы с длинной арифметикой, но там нет операции для возведения в степень :( подскажите какую нибудь похожую либу,...

BigInteger - C++
Что это? Есть уже готовый класс со всякими функциями? Или просто каждое число BigInteger - это массив из цифр, и нужно самому все делать...

biginteger - C++
реализовать некоторые функции класса BigInteger, Используя перегрузку операторов. сдвиги длинного числа влево и вправо на заданное...

BigInteger(c++) - C++
Здравствуйте!!! Помогите составить программу которая вычесляет сумму двух больших цифр (до 10^100 степени). Пробовал через unsigned long...

функции класса BigInteger. - C++
Используя перегрузку операторов, реализовать некоторые функции класса BigInteger. class BigInteger { public: // максимальное...

11
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
18.12.2013, 17:08 #2
почитай про перегрузку приведения к типу ( или как-то так)
в классе перегружаешь оператор приведения к такому-то типу и всё ок( сам не помню особо не пользовался пока что)
1
oks1d
4 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 91
18.12.2013, 17:29  [ТС] #3
Цитата Сообщение от dzrkot Посмотреть сообщение
почитай про перегрузку приведения к типу ( или как-то так)
в классе перегружаешь оператор приведения к такому-то типу и всё ок( сам не помню особо не пользовался пока что)
только вот к какому типу
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
18.12.2013, 17:38 #4
так, стоп, я невнимательно прочитал...Вы содаёте объект а типа БигИнтеджер, ему в конструктор вы записываете 65536 число. Перегрузите оператор присваивания, тогда возможно будет после создания объектра присваивать ему др значения (иногда для этого необходимо перегрузить конструктор)
т.е. что-то такое будет
C++
1
2
3
4
5
friend BigInteger& operator=(BigInteger&, int); // определение без friend
{
//
return *this;
}
1
oks1d
4 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 91
20.12.2013, 11:41  [ТС] #5
Например у меня есть переменная p и ей пользователь присаивает какое то большое значение. Как это будет выглядеть в коде?
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,387
Завершенные тесты: 1
20.12.2013, 11:52 #6
В классе создаем такой метод
C++
1
2
3
4
5
6
BigInteger& operator=(char* ss )
{
    BigIntege t(ss); // Конструктор из строки делает BigInteger
    (*this)=t; // Копируем в текущий объект (Не забудьте написать метод  operator=BigInteger& operator=(char* BigInteger); ).
    return *this;
}
Использование
C++
1
2
3
Biginteger b1,b2("111111111111111113333334444");
char n2[]="6666666666666666666677777777777777";
b1=n2;
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
20.12.2013, 12:01 #7
кстати для той функции не будет return *this;, там будет сооздаваться временный объект, который мы будет возвращать по значению,после чего будет вызываться констурктор копирования и применяться к временному объекту, и объекту, вызывающему operator=

смотря какое...если оно будет превосходить long double , то передавать через строку тогда, т.е. будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
BigInteger& operator=(BigInteger& obj, string& str);
{
// не знаю что в объекте, переводим string (если возможно) т.к. если объект построен на типах
// int итп, то с беск больш числами мы работать не сможем и нам придётся его цеиком переписывать 
// под string , включая всю арифметику итп итд
 
или проще, если соотв преобразования уже сделаны в конст копирования
// BigInteger temp(str); // тут мы вызываем конструктор с инициализацией от строки типа BigInteger(string);
// obj=temp;     //  вызываем оператор присваивания объеков
//
return &obj;
}
тут надо подумать как лучше, и вообще задачу в целом...
0
oks1d
4 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 91
20.12.2013, 12:41  [ТС] #8
Вот весь код, фун-ия main в самом низу , необходимо чтобы входное значение переменной p было biginteger
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#define _CRT_SECURE_NO_WARNINGS
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
 
#pragma hdrstop                  // Предоставляет дополнительный элемент управления по именам файлов предварительной компиляции и над местоположением на котором сохраняется состояние компиляции
 
using namespace std;
 
int power(int a, int b, int n){// a^b mod n
    int tmp=a;
    int sum=tmp;
    for(int i=1;i<b;i++){
        for(int j=1;j<a;j++){
            sum+=tmp;
            if(sum>=n){
                sum-=n;
            }
        }
        tmp=sum;
    }
    return tmp;
}
 
int mul(int a, int b, int n){// a*b mod n
    int sum=0;
     
    for(int i=0;i<b;i++){
        sum+=a;
         
        if(sum>=n){
            sum-=n;
        }
    }
 
    return sum;
}
 
 
void crypt(int p,int g,int x, string inFileName,string outFileName){
 
setlocale( LC_ALL,"Russian" );
    ifstream inf(inFileName.c_str());   //Формирует массив строк  И возвращает указатель на него.
    ofstream outf(outFileName.c_str()); 
    
    int y=power(g,x,p);
    printf("Открытый ключ (p,g,y)=", setlocale(LC_ALL, "Russian"));
    cout<<""<<"("<<p<<","<<g<<","<<y<<")"<<endl;
    cout<<"Закрытый ключ x="<<x<<endl;
    cout<<"Введите текст который необходимо зашифровать\n";
 
 
    while(inf.good()){
        int m=inf.get();
        if(m>0){
            cout<<(char)m;
 
            int k=rand()%(p-2)+1; // 1 < k < (p-1)
            int a= power(g,k,p);
            int b= mul(power(y,k,p),m,p);
            outf<<a<<" "<<b<<" ";
        }
    }
 
    cout<<endl;
 
    inf.close();
    outf.close();
}
 
void decrypt(int p,int x,string inFileName,string outFileName){
    
    ifstream inf(inFileName.c_str());
    ofstream outf(outFileName.c_str());
    setlocale( LC_ALL,"Russian" );
    
    cout<<"\nДешифрованый текст:"<<endl;
 
    while(inf.good()){
        int a=0;
        int b=0;
        inf>>a;
        inf>>b;
 
        if(a!=0&&b!=0){
 
 
            int deM=mul(b,power(a,p-1-x,p),p);// m=b*(a^x)^(-1)mod p =b*a^(p-1-x)mod p 
            char m=static_cast<char>(deM);
        
            outf<<m;
            cout<<m;
        }
    }
 
    cout<<endl;
 
    inf.close();
    outf.close();
}
 
int main(){
    srand(time(NULL));
    setlocale( LC_ALL,"Russian" );
    int p,g,x;          //переделать под biginteger переменную p
    cout<<"Введите p,g,x\n";
    cin>>p>>g>>x;
    crypt(p,g,x, "input.txt","outsh.txt");  
    decrypt(p,x, "outsh.txt","outdesh.txt");
    system("pause");
    return 0;
}
Добавлено через 33 минуты
p - большое целое число, и все, оно не преобразуется ни в стринг ни в какой то ещё тип . Оно задается 1 раз по ходу работы программы и все
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.12.2013, 12:58 #9
Цитата Сообщение от oks1d Посмотреть сообщение
p - большое целое число, и все, оно не преобразуется ни в стринг ни в какой то ещё тип . Оно задается 1 раз по ходу работы программы и все
А как оно по-Вашему может быть задано? Представление в виде строки - удобный способ задать число любого размера.
У Вас в начале треда один код, в сообщении #8 уже совсем другой. Не понимаю, что Вам действительно нужно.
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,387
Завершенные тесты: 1
20.12.2013, 12:58 #10
Цитата Сообщение от oks1d Посмотреть сообщение
p - большое целое число, и все
А кто за Вас будет реализовывать это большое целое?
0
oks1d
4 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 91
20.12.2013, 14:37  [ТС] #11
Цитата Сообщение от Tulosba Посмотреть сообщение
А как оно по-Вашему может быть задано? Представление в виде строки - удобный способ задать число любого размера.
У Вас в начале треда один код, в сообщении #8 уже совсем другой. Не понимаю, что Вам действительно нужно.
По примеру из 1 сообщения я хотел попробовать разобраться со своей переменной

Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
А кто за Вас будет реализовывать это большое целое?
GMP,NTL,crypt++,biginteger , пока не решил что из этого, только разбираюсь в них.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.12.2013, 14:48 #12
oks1d, если нужно чтобы работало такое:
C++
1
2
  biginteger p;
  cin>>p;
То для типа biginteger должен быть реализован
C++
1
 operator>>( std::istream& i, biginteger& value)
Если его нет, то надо смотреть, что вообще есть для ввода. В зависимости от того на какой реализации остановитесь.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2013, 14:48
Привет! Вот еще темы с ответами:

Конструкторы и деструктор класса BigInteger - C++
Задание выглядит так. Определить класс BigInteger в файле BigInteger.h, который может быть использован для хранения больших...

Переменная или переменная и условие - C++
Привет всем. Стало интересно. Есть предположим функция. В ней ссылкой передается аргумент Status; Как лучше сделать? ...

Переменная - C++
Мне нужная переменная(ые) в 1 байт. Где её можно взять?

переменная - C++
#include &lt;iostream&gt; using namespace std; void func1(); void func2(); int count; // Это голобальная переменная int main()...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
20.12.2013, 14:48
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru