0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
1

Числа Фибоначчи в длинной арифметике (код почти готов, но я застолбил)

16.11.2015, 18:52. Показов 1438. Ответов 13

Здравствуйте, дорогие форумчане. Есть такое задание, как написать код для 100 чисел Фибоначчи в длинной арифметике. Делал я его, делал, и застолбил.
1) Не знаю, может голова не варит и не замечаю, но выбивает в main.cpp в строке с cout такую ошибку: no match for 'operator<<' in 'std::operator<< <std::char_traits<char> >((* & std::cout.std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >(i)), ((const char*)"\011")) << fib[i]' - не могу понять, хотя скорее всего что-то очевидное упустил.
2) можете разъяснить, чего я не замечаю здесь и что нужно добавить для полной работоспособности?
Заранее благодарю.

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
115
116
117
118
119
120
121
122
123
124
125
126
127
main.cpp
 
 
 
 
#include <cstdlib>
#include <iostream>
#include "unit128.h"
 
using namespace std;
 
int main()
{
    uint128 fib[100]={1,1};
    uint32_t out[4];
    int i;
 
 
 
    for (int i=0; i<100; i++)
    {
       fib[i] = fib[i-1] + fib[i-2];
        cout<<i<<" "<<fib[i]<<endl;
//        fib[i].print();
 
 
    }
 
 
    system("PAUSE");
    return 0;
}
 
 
 
 
unit128.h
 
#include <stdint.h>
#include <iostream>
#ifndef UNIT128_H_INCLUDED
#define UNIT128_H_INCLUDED
 
using namespace std;
 
class uint128
{
   uint32_t data[4];
public:
    uint128();
    uint128(int i);
    void get(uint32_t out[4]);
    void print(void);
friend ostream &operator<<(ostream& os,const uint128 &i);
 
};
 
ostream &operator<<(ostream& os,const uint128 &i);
 
#endif // UNIT128_H_INCLUDED
 
 
 
 
 
unit128.cpp
 
#include "unit128.h"
#include <stdint.h>
#include <iostream>
 
using namespace std;
 
uint128::uint128()
{
    data[3]=0;
    data[2]=0;
    data[1]=0;
    data[0]=0;
}
 
 
uint128::uint128(int i)
{
    data[3]=0;
    data[2]=0;
    data[1]=0;
    data[0]=i;
 
}
 
 
 void uint128::get(uint32_t out[4])
 {
      out[0]=data[0];
      out[1]=data[1];
      out[2]=data[2];
      out[3]=data[3];
 }
 
uint128 uint128::operator+ (uint128 b)
{
        uint128 temp;
        uint64_t res[4];
 
 
        res[0] = (uint64_t)data[0] + (uint64_t)b.data[0];
 
        temp.data[0]=(uint32_t)res[0];
        res[1] = (uint64_t)data[1] + (uint64_t)b.data[1] + (res[0]>>32);
 
        temp.data[1]=(uint32_t)res[1];
 
        res[2] = (uint64_t)data[2] + (uint64_t)b.data[2] + (res[1]>>32);
        temp.data[2]=(uint32_t)res[2];
 
        res[3] = (uint64_t)data[3] + (uint64_t)b.data[3] + (res[2]>>32);
        temp.data[3]=(uint32_t)res[3];
 
 
        return temp;
 
}
ostream &operator<<(ostream& os,const uint128 &i);
{
    return os;
}
Добавлено через 22 минуты
Оу, в main.cpp нужно так:
C++
1
cout<<i<<"\t"<<fib[i]<<endl;
а не
C++
1
cout<<i<<" "<<fib[i]<<endl;
Простите, забыл. Но ошибку это не исправило
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2015, 18:52
Ответы с готовыми решениями:

Совет в написании/использовании длинной арифметике на примере чисел Фибоначчи
Доброго времени суток. Недавно передо мною появилось задание использование длинной арифметики....

Предложить эффективный алгоритм умножения числа на дробь в длинной арифметике
Нам дано длинное натуральное число, представленное в виде динамического массива: 1) разряды...

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

Подскажите литературу по длинной арифметике
Длинная арифметика — это набор программных средств (структуры данных и алгоритмы), которые...

13
Модератор
Эксперт С++
12080 / 9759 / 5902
Регистрация: 18.12.2011
Сообщений: 26,201
16.11.2015, 19:29 2
Лучший ответ Сообщение было отмечено bobiko как решение

Решение

C++
1
2
3
4
5
ostream &operator<<(ostream& os,const uint128 &i)
{
     i.print(os); // Вы этот метод еще не реализовали
     return os;
}
1
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
16.11.2015, 22:10  [ТС] 3
Спасибо, одну из ошибок понял, но...взялся сокращать код, тем самым немного переконстуировал, но в цикле for в main.cpp вот здесь
C++
1
       fib[i] = fib[i-1] + fib[i-2];
пишет error: no match for 'operator+' in 'fib[(i + -1)] + fib[(i + -2)]'
Можете подсказать, где и чего я напутал.
Да и, если можно, не только в этой строке, хоть ошибок пока не вижу.
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
main.cpp
 
 
#include <cstdlib>
#include <iostream>
#include "unit128_2.h"
 
using namespace std;
 
int main()
{
    uint128 fib[100] = {1,1};
 
    for (int i=2; i<100; i++)
    {
       fib[i] = fib[i-1] + fib[i-2];
        cout<<i<<"\t"<<fib[i]<<endl;
 
    }
 
 
    system("PAUSE");
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
unit128_2.h
 
 
 
#include <stdint.h>
#include <iostream>
#ifndef UNIT128_H_INCLUDED
#define UNIT128_H_INCLUDED
 
using namespace std;
 
class uint128
{
   uint32_t data[4];
public:
    uint128(uint64_t f=0);
friend ostream &operator<<(ostream& os,const uint128 &i);
 
};
 
ostream &operator<<(ostream& os,const uint128 &i);
 
#endif // UNIT128_H_INCLUDED
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
unit128_2.cpp
 
 
 
#include "unit128_2.h"
#include <stdint.h>
#include <iostream>
 
using namespace std;
 
uint128::uint128(uint64_t f=0)
{
        data[3]=0;
        data[2]=0;
        data[1]=f>>32;
        data[0] = f& 0xffffffff;
    }
 
    uint128::uint128 operator+(uint128 b)
    {
        uint64_t result =0;
        uint128  tmp;
 
        for(int i=0; i<4; ++i)
    {
            result = (result>>32) + data[i] + b.data[i];
            tmp.data[i] = result& 0xffffffff;
        }
        return tmp;
    }
    friend ostream &operator<<(ostream& os, uint128);
 
};
 
ostream &operator<<(ostream& os,const uint128 &i);
{
    os<<i.data[3]<<i.data[2]<<i.data[1]<<i.data[0]<<endl;
    return os;
}
0
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
16.11.2015, 22:53  [ТС] 4
Здравствуйте, дорогие форумчане. При компиляции кода выскакивает error: no match for 'operator+' in 'fib[(i + -1)] + fib[(i + -2)]' в main
Можете подсказать, что да к чему здесь и как исправить ошибку?
main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdlib>
#include <iostream>
#include "unit128_2.h"
 
using namespace std;
 
int main()
{
    uint128 fib[100] = {1,1};
 
    for (int i=2; i<100; i++)
    {
        fib[i] = fib[i-1] + fib[i-2];
            cout<<i<<"\t"<<fib[i]<<endl;
 
    }
 
    system("PAUSE");
    return 0;
}

unit128_2.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdint.h>
#include <iostream>
#ifndef UNIT128_H_INCLUDED
#define UNIT128_H_INCLUDED
 
using namespace std;
 
    class uint128
 {
        uint32_t data[4];
      public:
        uint128(uint64_t f=0);
    friend ostream &operator<<(ostream& os,const uint128 &i);
 
        };
 
    ostream &operator<<(ostream& os,const uint128 &i);
 
#endif // UNIT128_H_INCLUDED

unit128.cpp
Кликните здесь для просмотра всего текста
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
#include "unit128_2.h"
#include <stdint.h>
#include <iostream>
 
using namespace std;
 
    uint128::uint128(uint64_t f=0)
 {
        data[3] = 0;
        data[2] = 0;
        data[1] = f>>32;
        data[0] = f& 0xffffffff;
    }
 
    int128::uint128 operator+(uint128 b)
 {
        uint64_t result = 0;
        uint128  tmp;
 
            for(int i=0; i<4; ++i)
        {
                result = (result>>32) + data[i] + b.data[i];
                tmp.data[i] = result& 0xffffffff;
            }
                return tmp;
                }
    friend ostream &operator<<(ostream& os, uint128);
 
    };
 
    ostream &operator<<(ostream& os,const uint128 &i);
 {
    os<<i.data[3]<<i.data[2]<<i.data[1]<<i.data[0]<<endl;
        return os;
        }
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
16.11.2015, 23:07 5
Цитата Сообщение от bobiko Посмотреть сообщение
Можете подсказать, что да к чему здесь
ошибки указаны в комментариях.
код рабочий.

однако я его правил онлайн:
http://rextester.com/EOK20058

поэтому я его склеил в один файл.
вам придется расклеить
его опять по нескольким файлам.

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
#include <cstdlib>
#include <iostream>
 
 
// ---------------------------------------
//#include "unit128_2.h"
 
#include <stdint.h>
#include <iostream>
 
#ifndef UNIT128_H_INCLUDED
#define UNIT128_H_INCLUDED
 
using namespace std;
 
 
class uint128
{
    uint32_t data[4];
public:
    uint128(uint64_t f=0);
    friend ostream &operator<<(ostream& os,const uint128 &i);
    
    // отсутствовал прототип
    uint128 operator+(const uint128& b);
};
 
ostream &operator<<(ostream& os,const uint128 &i);
 
#endif // UNIT128_H_INCLUDED
 
 
//#include "unit128_2.h"
#include <stdint.h>
#include <iostream>
 
using namespace std;
 
 
 
//error: default argument given for parameter 1 of ‘uint128::uint128(uint64_t)’ [-fpermissive]
//uint128::uint128(uint64_t f=0)  
uint128::uint128(uint64_t f)
{
    data[3] = 0;
    data[2] = 0;
    data[1] = f>>32;
    data[0] = f& 0xffffffff;
}
 
// error: ‘int128’ does not name a type
//int128::uint128 operator+(uint128 b)
uint128 uint128::operator+(const uint128& b)
{
 
    uint64_t result = 0;
    uint128  tmp;
 
    for(int i=0; i<4; ++i)
        result = (result>>32) + data[i] + b.data[i],
        tmp.data[i] = result& 0xffffffff;
    return tmp;
}
 
ostream &operator<<(ostream& os,const uint128 &i)
{
    return os<<i.data[3]<<i.data[2]<<i.data[1]<<i.data[0]<<endl;
}
 
// ---------------------------------------
 
 
 
int main()
{
    uint128 fib[100] = {1,1};
 
    for (int i=2; i<100; i++)
        fib[i] = fib[i-1] + fib[i-2],
        cout<<i<<"\t"<<fib[i]<<endl;
}
1
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
17.11.2015, 02:00  [ТС] 6
Ох, теперь я понял что да в чем. Огромное Вам спасибо за разъяснения и потраченное на меня время с пользой для меня же.)
0
Модератор
Эксперт С++
12080 / 9759 / 5902
Регистрация: 18.12.2011
Сообщений: 26,201
17.11.2015, 07:44 7
Лучший ответ Сообщение было отмечено bobiko как решение

Решение

Цитата Сообщение от bobiko Посмотреть сообщение
uint128::uint128 operator+(uint128 b)
C++
1
uint128 uint128::operator+(uint128 b)
И объявление
C++
1
uint128 operator+(uint128 b);
запишите в объявление класса

В VS 2008 получилось так
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
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
 
class uint128
{
    UINT32 data[4];
public:
    uint128 operator+(uint128 b);
    uint128(UINT64 f=0);
    friend ostream &operator<<(ostream& os,const uint128 &i);
 
};
 
uint128::uint128(UINT64 f)
{
    data[3]=0;
    data[2]=0;
    data[1]=f>>32;
    data[0] = f& 0xffffffff;
}
 
uint128 uint128::operator+(uint128 b)
{
    UINT64 result =0;
    uint128  tmp;
 
    for(int i=0; i<4; ++i)
    {
        result = (result>>32) + data[i] + b.data[i];
        tmp.data[i] = result& 0xffffffff;
    }
    return tmp;
}
 
ostream &operator<<(ostream& os,const uint128 &i)
{
    os<<i.data[3]<<i.data[2]<<i.data[1]<<i.data[0]<<endl;
    return os;
} 
int main()
{
    uint128 fib[100] = {1,1};
 
    for (int i=2; i<100; i++)
    {
        fib[i] = fib[i-1] + fib[i-2];
        cout<<i<<"\t"<<fib[i]<<endl;
 
    }
 
 
    system("PAUSE");
    return 0;
}
1
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
17.11.2015, 15:05  [ТС] 8
Спасибо что помогли разобраться)
0
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
17.11.2015, 15:32  [ТС] 9
Здравствуйте, уважаемые форумчане. Есть такая ошибка «'uint128::uint128' names the constructor, not the type» в строке 69 в uint128 cpp, вот только смысл того, где она завязана не могу понять. Можете подсказать?
main.cpp
Кликните здесь для просмотра всего текста
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
#include <cstdlib>
#include <iostream>
#include "uint128.h"
 
using namespace std;
 
int main()
{
    uint128 fib[100]={1,1};
    uint32_t out[4];
    int i=1;
 
 
 
    for (int i=2; i<100; i++)
    {
        fib[i]=fib[i-1]+fib[i-2];
        for (int i=0; i<100; ++i)
        cout<<i<<" "<<fib[i]<<endl;
 
    }
 
 
    system("PAUSE");
    return 0;
}

uint128.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdint.h>
#include <iostream>
#ifndef UNIT128_H_INCLUDED
#define UNIT128_H_INCLUDED
 
using namespace std;
 
struct uint128
{
   uint32_t data[4];
    uint128();
    uint128(int i);
    void get(uint32_t out[4]);
    void print(void);
    uint128 operator+(uint128 b);
friend ostream&operator<<(ostream&,uint128);
 
};
 
ostream&operator<<(ostream&,uint128);
 
#endif // UNIT128_H_INCLUDED

uint128.cpp
Кликните здесь для просмотра всего текста
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
#include "uint128.h"
#include <stdint.h>
#include <iostream>
 
using namespace std;
 
uint128::uint128()
{
    data[3]=0;
    data[2]=0;
    data[1]=0;
    data[0]=0;
}
 
 
uint128::uint128(int i)
{
    data[3]=0;
    data[2]=0;
    data[1]=0;
    data[0]=i;
 
}
 
 
 
 void uint128::get(uint32_t out[4])
 {
      out[0]=data[0];
      out[1]=data[1];
      out[2]=data[2];
      out[3]=data[3];
 }
 
 
void uint128::print(void)
{
     int i,k,j;
     char c;
 
     for(j=3;j>=0;j--)
     {
                     for(i=28;i>=0;i-=4)
                     {
                                        k= (int)((data[j]>>i)&0x0000000fl);
                                        if(k>9)
                                        {
                                         c=k;
                                         if (c==10) c='A';
                                         if (c==11) c='B';
                                         if (c==12) c='C';
                                         if (c==13) c='D';
                                         if (c==14) c='E';
                                         if (c==15) c='F';
                                         cout<<c;
                                         }
                                        else
                                        {
                                        cout<<k;
                                        }
                     }
                     cout<<"  ";
     }
 
}
 
 
 
uint128::uint128 operator+ (uint128 b)
{
        uint128 temp;
        uint64_t res[4];
 
 
        res[0] = (uint64_t)data[0] + (uint64_t)b.data[0];
 
        temp.data[0]=(uint32_t)res[0];
        res[1] = (uint64_t)data[1] + (uint64_t)b.data[1] + (res[0]>>32);
 
        temp.data[1]=(uint32_t)res[1];
 
        res[2] = (uint64_t)data[2] + (uint64_t)b.data[2] + (res[1]>>32);
        temp.data[2]=(uint32_t)res[2];
 
        res[3] = (uint64_t)data[3] + (uint64_t)b.data[3] + (res[2]>>32);
        temp.data[3]=(uint32_t)res[3];
 
 
        return temp;
 
}
    ostream &operator<<(ostream& os,const uint128 &i)
{
     os<<i.data[3]<<i.data[2]<<i.data[1]<<i.data[0]<<endl;
     return os;
}
0
83 / 10 / 8
Регистрация: 17.11.2015
Сообщений: 39
17.11.2015, 15:38 10
C++
1
uint128 uint128::operator+ (uint128 b)
0
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
17.11.2015, 15:42  [ТС] 11
о, помогло, но не совсем. После этого в строке 19 в main есть такое: undefined reference to `operator<<(std::ostream&, uint128)'
0
В астрале
Эксперт С++
8042 / 4799 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.11.2015, 15:44 12
bobiko, Ну так разные функции же.
C++
1
ostream&operator<<(ostream&,uint128);
в хедере
C++
1
ostream &operator<<(ostream& os,const uint128 &i)
в файле реализации.
1
83 / 10 / 8
Регистрация: 17.11.2015
Сообщений: 39
17.11.2015, 15:52 13
bobiko, потому что не совпадают сигнатуры для оператора <<. А вообще, у Вас здесь struct, у которого все поля и так открытые, friend лишний поэтому.
0
0 / 0 / 0
Регистрация: 16.11.2015
Сообщений: 59
17.11.2015, 16:00  [ТС] 14
ForEveR, благодарю, не заметил даже.

Добавлено через 1 минуту
Немного глупые ошибки допустил в редактировании, но спасибо за разъяснение и указание на них, исправил все и заработало.)

Добавлено через 50 секунд
IronPhoenix, Немного глупые ошибки допустил в редактировании, но спасибо за разъяснение и указание на них, исправил все и заработало, ведь использовал класс, а потом понял, что нужна структура и про дружественную и забыл.)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2015, 16:00
Помогаю со студенческими работами здесь

Система остаточных классов в длинной арифметике
Добрый день, коллеги. Занялся реализацией длинной арифметики (так, чисто для тренировки) и у...

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

Нахождение ошибки в длинной арифметике
Задача следующая: Вам нужно найти сумму двух целых чисел размером до 1 000 000 цифр. Исходные...

Нахождение НОД и НОК в длинной арифметике
Всем привет. Дали задание написать программу для нахождения НОД и НОК двух чисел, но в длинной...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru