С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/272: Рейтинг темы: голосов - 272, средняя оценка - 4.94
 Аватар для Tengel
2 / 2 / 0
Регистрация: 08.10.2008
Сообщений: 17

Числа Фибоначчи: иногда выводятся отрицательные значения

11.10.2008, 10:27. Показов 55921. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня вот какая проблема: Числа Фибоначчи определяются рекуррентной формулой:

f0 = 0; f1 = 1; fn = fn-1 + fn-2;

Начало последовательности имеет вид 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... .
Входные данные:
В единственной строке находится число N (0 <= N <= 10000).
Выходные даны:
Выведите N-те число Фибоначчи.
Пример введения
7
Пример выведения
13
я програмку написал, но она мне иногда выводит отрецательные числа...подскажите что мне сделать, что бы ета программа корректно работала.
вот и она:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
void main()
{
    int n;
    cout << "Введите номер числа :";
    do {cin>>n;} while ((n<0)&&(n>10000));
    long long fib[10000];
    fib[0]=0;
    fib[1]=1;
    for (int i=2;i<9999;i++)
    {
        fib[i] = fib[i-1]+fib[i-2];
    }
    cout<<"Число с номером "<<n<<"ето:";
    cout<<fib[n];
    system("pause");
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.10.2008, 10:27
Ответы с готовыми решениями:

Выводятся большие отрицательные числа
В функции max двумерный массив переводится сначала в одномерный, при выводе одномерного массива вместо правильных элементов выводятся...

Не выводятся на экран числа Фибоначчи
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; int is_Fibbonachi(long N) { ...

Выводятся отрицательные числа
часто выводит отрицательные числа, что по коду и по моим знаниям в принципе невозможно? int dlina = richTextBox1-&gt;TextLength;//...

20
 Аватар для ABTOP
36 / 36 / 4
Регистрация: 09.06.2008
Сообщений: 324
11.10.2008, 10:42
Знакомая история... Просто переменная выходит за допустимый диапазон своего типа, вот число и отрицательное... Попробуй воспользоваться типом unsigned long int или unsigned long double... Думаю его хватит...
0
 Аватар для Tengel
2 / 2 / 0
Регистрация: 08.10.2008
Сообщений: 17
11.10.2008, 10:55  [ТС]
сделал так, но числа выводятса меньшие, чем когда я напишу unsigned long long, как тип массива......но что так, что так, ответ одинаков:Неверный ответ
и что не делал уже, все равно корректно не работает....
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
11.10.2008, 11:23
Tengel, я недавно писал прогу по остаткам от деления чисел фибоначчи на большие числа, хватало long long, но там алгоритм очень замороченный, а вам для вычисления даже двухтысячного числа 80 бит(long double) ну никак не хватит... либо ищите библиотеки для работы с большими числами, либо ограничьтесь 1000...
0
V.A.M
14.10.2008, 21:34
Poprobuy ispolzovat' clojenie dlinnix dvux chisel' s ispolzovaniem String, Esli tebe nujn@ ya moga dat' tebe code dlya clojenita dlinnix chisel' (okolo ~ 250 cimvolov). Make that as function with 2 arguments...
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
15.10.2008, 09:37
вот тебе рабочий код на любой фибоначчи:
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
#include <iostream>
#include <math.h>
using namespace std;
const int N = 220;
int ctrl = 0;
div_t t;
void add(int a[N], int b[N], int c[N]){
  memset(c, 0, sizeof(int)*N);
  int i = 0;
  for(i = N - 1; i >= 0; i--){
    if(t.quot){
      c[i]++;
      if(i < ctrl) ctrl = i;
    }
    t = div((c[i] + a[i] + b[i]),10);
    c[i] = t.rem;
  }
}
int main()
{
 int fib0[N];int fib1[N];int fib2[N];
 memset(fib0, 0, sizeof(int)*N);
 memset(fib1, 0, sizeof(int)*N);
 memset(fib2, 0, sizeof(int)*N);
 int n;
 cin>>n;
 fib0[N - 1] = 1;fib1[N - 1] = 1;
 ctrl = N - 1;
 if(n<2) fib2[N - 1] = 1;
 for (int i = 2;i <= n;i++)
 {
   add(fib0, fib1, fib2);
   memmove(fib0, fib1, sizeof(int)*N);
      memmove(fib1, fib2, sizeof(int)*N);
 }
 for(int i = ctrl; i < N; i++) cout<<fib2[i];
 return 0;
}
3
LeshKing
21.03.2014, 18:34
Зачем столько сложностей?

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int a ,b, k;
    a=0;
    b=1;
    cin >> k;
    while (k<=0)
    {
        cout << "ERROR! Enter the number greater than zero: ";
        cin >> k;
    }
    while (k!=0)
    {
        a=a+b;
        b=a-b;
        k=k-1;
        cout << a << " ";
    }
    return 0;
}
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
22.03.2014, 19:31
Цитата Сообщение от LeshKing Посмотреть сообщение
Зачем столько сложностей?
Для расчета больших чисел Фибоначчи. Предположим надо посчитать тысячное число Фибоначчи.
Ваш код для этого не подойдет.

Lord_Voodoo, думаю, что Ваш код содержит ошибку.
Проверяя результаты программы для разных чисел нашел несоответствие с таблицами чисел Фибоначчи.

Вот работа программы
1)
100
573147844013817084101

2)
200
4539736941653079531972969696974106192338 26

Вот данные из таблицы чисел Фибоначчи, а также из проекта wolframalpha.
Ф(100)=354224848179261915075
Ф(200)=280571172992510140037611932413038 677189525
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.03.2014, 10:47
BlackSpace, ну спорить не буду, но код тоже проходил тестирование и на скорость, и на емкость... не помню, как ресурс называется... если есть ошибка, то извиняйте...
0
0 / 0 / 0
Регистрация: 29.05.2017
Сообщений: 1
29.05.2017, 15:01
самый изи вариант!!! тока с большими числами не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main ()
{
 int a,c=1,i,ans;
 float b=0;
 cin >> a;
 for (i=1;i<a;i++)
 {
    ans=c+b;
    b=c;
    c=ans;
 }
 cout << b;
    return 0;
}
0
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
29.05.2017, 16:07
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
#include <vector>
#include <iostream>
#include <fstream>
#include <iterator>
#include <string>
#include <algorithm>
#include <exception>
#include <stdexcept>
#include <cstring>
#include <cstdio>
#include <cstdlib>
 
class BigInteger
{
public: 
    BigInteger()
    {
        _data.push_back(0);
    }
    
    BigInteger(long long x)
    {
        while(x)
        {
            _data.push_back(x % _base);
            x /= _base;
        }
        
        if(_data.empty()) _data.push_back(0);
    }
    
    BigInteger(unsigned long long x)
    {
        while(x)
        {
            _data.push_back(x % _base);
            x /= _base;
        }
        
        if(_data.empty()) _data.push_back(0);
    }
 
    BigInteger(int x) : BigInteger((long long)x) {}
    BigInteger(unsigned int x) : BigInteger((unsigned long long)x) {}
    BigInteger(short x) : BigInteger((long long)x) {}
    BigInteger(unsigned short x) : BigInteger((unsigned long long)x) {}
    BigInteger(char x) : BigInteger((long long)x) {}
    BigInteger(unsigned char x) : BigInteger((unsigned long long)x) {}
 
    BigInteger(std::string &s)
    {
        for(int i = (int)s.size(); i > 0; i -= 9)
            if(i < 9)
                _data.push_back(atoi(s.substr(0, i).data()));
            else
                _data.push_back(atoi(s.substr(i - 9, 9).data()));
        
        while(_data.size() > 1 && _data.back() == 0)
            _data.pop_back();
    }
    
    BigInteger(const char *s)  
    {
        std::string d = s;
        
        for(int i = (int)d.size(); i > 0; i -= 9)
            if(i < 9)
                _data.push_back(atoi(d.substr(0, i).data()));
            else
                _data.push_back(atoi(d.substr(i - 9, 9).data()));
        
        while(_data.size() > 1 && _data.back() == 0)
            _data.pop_back();
    }
    
    BigInteger(const BigInteger& b)
    {
        _data.resize(b._data.size());
        std::copy(b._data.begin(), b._data.end(), _data.begin());
    }
    
    void ToString(char *s) const
    {
        sprintf(s, "%d", _data.empty() ? 0 : _data.back());
        for(int i = (int)_data.size() - 2; i >= 0; i--)
            sprintf(s, "%s%09d", s, _data[i]);
    }
    
    std::string ToString() const
    {
        char *buff = (char*)malloc(20);
        
        sprintf(buff, "%d", _data.empty() ? 0 : _data.back());
        std::string res = buff;
        
        for(int i = (int)_data.size() - 2; i >= 0; i--)
        {
            sprintf(buff, "%09d", _data[i]);
            res += buff;
        }
            
        free(buff);
        
        return res;
    }
    
    friend const BigInteger operator+(BigInteger &i);
    friend const BigInteger& operator++(BigInteger &i);
    friend const BigInteger& operator--(BigInteger &i);
    friend const BigInteger operator++(BigInteger &i, int);
    friend const BigInteger operator--(BigInteger &i, int);
    
    friend const BigInteger operator+(const BigInteger &c, const BigInteger &b);
    friend const BigInteger operator-(const BigInteger &c, const BigInteger &b);
    friend const BigInteger operator*(const BigInteger &a, const BigInteger &b);
    friend const BigInteger operator/(const BigInteger &a, const BigInteger &b);
    friend const BigInteger operator%(const BigInteger &a, const BigInteger &b);
    
    friend BigInteger& operator+=(BigInteger &a, const BigInteger &b);
    friend BigInteger& operator-=(BigInteger &a, const BigInteger &b);
    friend BigInteger& operator*=(BigInteger &a, const BigInteger &b);
    friend BigInteger& operator/=(BigInteger &a, const BigInteger &b);
    friend BigInteger& operator%=(BigInteger &a, const BigInteger &b);
    
    friend bool operator==(const BigInteger &a, const BigInteger &b);
    friend bool operator<=(const BigInteger &a, const BigInteger &b);
    friend bool operator>=(const BigInteger &a, const BigInteger &b);
    friend bool operator<(const BigInteger &a, const BigInteger &b);
    friend bool operator>(const BigInteger &a, const BigInteger &b);
    friend bool operator!=(const BigInteger &a, const BigInteger &b);
    
    /*operator long long() const
    {
        long long res = 0, b = 1;
        for(size_t i = 0; i < _data.size(); i++)
        {
            res += b * _data[i];
            b *= BigInteger::_base;
        }
        return res;
    }
    
    operator unsigned long long()
    {
        unsigned long long res = 0, b = 1;
        for(size_t i = 0; i < _data.size(); i++)
        {
            res += b * _data[i];
            b *= BigInteger::_base;
        }
        return res;
    }*/
    
    friend std::istream& operator>>(std::istream &is, BigInteger &i)
    {
        std::string s;
        is >> s;
        i = BigInteger(s);
        return is;
    }
    
    friend std::ostream& operator<<(std::ostream &os, const BigInteger &i)
    {
        os << i.ToString();
        return os;
    }
    
private:
    static const int _base = 1000 * 1000 * 1000;
    std::vector<int> _data;
    
    int _cmp(const BigInteger &a, const BigInteger &b) const //a - b, 1 if a > b
    {
        if(a._data.size() > b._data.size()) return 1;
        if(a._data.size() < b._data.size()) return -1;
        
        for(int i = (int)a._data.size() - 1; i >= 0; i--)
        {
            if(a._data[i] > b._data[i]) return 1;
            if(a._data[i] < b._data[i]) return -1;
        }
        
        return 0;
    }
    
    BigInteger _div_short(const BigInteger &c, int b, int &mod) const
    {
        mod = 0;
        BigInteger a = c;
        for(int i = (int)a._data.size() - 1; i >= 0; i--) 
        {
            long long cur = a._data[i] + mod * 1ll * BigInteger::_base;
            a._data[i] = int(cur / b);
            mod = int(cur % b);
        }
        
        while (a._data.size() > 1 && a._data.back() == 0)
            a._data.pop_back();
        
        return a;
    }
    
    bool _is_zero() const
    {
        return _data.size() == 1 && _data[0] == 0;
    }
};
 
const BigInteger operator+(const BigInteger &i) 
{
    return BigInteger(i);
}
 
const BigInteger& operator++(BigInteger &i) 
{
    int j = 0;
    i._data[0]++;
    
    while(i._data[j] >= BigInteger::_base)
    {
        if(j == (int)i._data.size() - 1) i._data.push_back(1); else i._data[j + 1]++;
        i._data[j] -= BigInteger::_base;
        j++;
    }
    
    return i;
}
 
const BigInteger operator++(BigInteger &i, int) 
{
    BigInteger old = BigInteger(i);
    
    int j = 0;
    i._data[0]++;
    
    while(i._data[j] >= BigInteger::_base)
    {
        if(j == (int)i._data.size() - 1) i._data.push_back(1); else i._data[j + 1]++;
        i._data[j] -= BigInteger::_base;
        j++;
    }
    
    return old;
}
 
//TODO: Optimize
const BigInteger& operator--(BigInteger &i) 
{
    if(!i._is_zero()) i = i - 1;
    return i;
}
 
//TODO: Optimize
const BigInteger operator--(BigInteger &i, int) 
{
    BigInteger old = BigInteger(i);
    if(!i._is_zero()) i = i - 1;
    return old;
}
 
const BigInteger operator+(const BigInteger &c, const BigInteger &b)
{
    BigInteger a = c;
        
    int carry = 0;
    for(size_t i = 0; i < std::max(a._data.size(), b._data.size()) || carry; i++) 
    {
        if(i == a._data.size()) a._data.push_back(0);
        a._data[i] += carry + (i < b._data.size() ? b._data[i] : 0);
        carry = a._data[i] >= BigInteger::_base;
        if(carry) a._data[i] -= BigInteger::_base;
    }   
        
    return a;       
}
 
const BigInteger operator-(const BigInteger &c, const BigInteger &b)
{
    if(c < b) throw std::invalid_argument("a - b, a must b greater or equal zero");
    BigInteger a = c;
        
    int carry = 0;
    for(size_t i = 0; i < b._data.size() || carry; i++) 
    {
        a._data[i] -= carry + (i < b._data.size() ? b._data[i] : 0);
        carry = a._data[i] < 0;
        if(carry) a._data[i] += BigInteger::_base;
    }
        
    while(a._data.size() > 1 && a._data.back() == 0)
        a._data.pop_back();
            
    return a;       
}
 
const BigInteger operator*(const BigInteger &a, const BigInteger &b)
{
    BigInteger c;
    c._data.resize(a._data.size() + b._data.size());
        
    for(size_t i = 0; i < a._data.size(); i++)
        for(int j = 0, carry = 0; j < (int)b._data.size() || carry; j++) 
        {
            long long cur = c._data[i + j] + a._data[i] * 1ll * (j < (int)b._data.size() ? b._data[j] : 0) + carry;
            c._data[i + j] = int(cur % BigInteger::_base);
            carry = int(cur / BigInteger::_base);
        }
            
    while(c._data.size() > 1 && c._data.back() == 0)
        c._data.pop_back();
            
    return c;       
}
 
//TODO: Division by zero
const BigInteger operator/(const BigInteger &a, const BigInteger &b)
{
    if(b._is_zero()) throw std::invalid_argument("division by zero");
    BigInteger l = 0, r = a + 1, m;
    int t;
    while(r - l > 1)
    {
        //m = (r + l) / 2;
        m = a._div_short(r + l, 2, t);
        if(b * m <= a) l = m; else r = m;
    }
    return l;
}
 
//TODO: Division by zero
const BigInteger operator%(const BigInteger &a, const BigInteger &b)
{
    if(b._is_zero()) throw std::invalid_argument("division by zero");
    BigInteger l = 0, r = a + 1, m;
    int t;
    while(r - l > 1)
    {
        //m = (r + l) / 2;
        m = a._div_short(r + l, 2, t);
        if(b * m <= a) l = m; else r = m;
    }
    return a - b * l;
}
 
BigInteger& operator+=(BigInteger &a, const BigInteger &b)
{
    int carry = 0;
    for(size_t i = 0; i < std::max(a._data.size(), b._data.size()) || carry; i++) 
    {
        if(i == a._data.size()) a._data.push_back(0);
        a._data[i] += carry + (i < b._data.size() ? b._data[i] : 0);
        carry = a._data[i] >= BigInteger::_base;
        if(carry) a._data[i] -= BigInteger::_base;
    }   
    return a;
}
 
BigInteger& operator-=(BigInteger &a, const BigInteger &b)
{
    int carry = 0;
    for(size_t i = 0; i < b._data.size() || carry; i++) 
    {
        a._data[i] -= carry + (i < b._data.size() ? b._data[i] : 0);
        carry = a._data[i] < 0;
        if(carry) a._data[i] += BigInteger::_base;
    }
        
    while(a._data.size() > 1 && a._data.back() == 0)
        a._data.pop_back();
            
    return a;
}
 
BigInteger& operator*=(BigInteger &a, const BigInteger &b)
{
    a = a * b;
    return a;
}
 
BigInteger& operator/=(BigInteger &a, const BigInteger &b)
{
    a = a / b;
    return a;
}
 
BigInteger& operator%=(BigInteger &a, const BigInteger &b)
{
    a = a % b;
    return a;
}
 
bool operator==(const BigInteger& a, const BigInteger& b)
{
    return a._cmp(a, b) == 0;
}
 
bool operator<=(const BigInteger& a, const BigInteger& b)
{
    return a._cmp(a, b) <= 0;
}
 
bool operator>=(const BigInteger& a, const BigInteger& b)
{
    return a._cmp(a, b) >= 0;
}
 
bool operator<(const BigInteger& a, const BigInteger& b)
{
    return a._cmp(a, b) < 0;
}
 
bool operator>(const BigInteger& a, const BigInteger& b)
{
    return a._cmp(a, b) > 0;
}
 
bool operator!=(const BigInteger& a, const BigInteger& b)
{
    return a._cmp(a, b) != 0;
}
 
int main()
{
    int n;
    std::cin >> n;
    std::vector<BigInteger> f = { BigInteger(0), BigInteger(1) };
    for(int i = 2; i <= n; i++) f.push_back(f[i - 1] + f[i - 2]);
    std::cout << f[n].ToString() << std::endl;
    return 0;
}
0
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 16
24.02.2018, 18:00
Я конечно не специалист, но по-моему проблема только в том, что в скобках условия указано N<0 N>10000
А по условию надо N>0 и N <10000. Тогда не будет отрицательных чисел
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
24.02.2018, 19:18
Цитата Сообщение от fedos1994 Посмотреть сообщение
Я конечно не специалист,
Еще какой не специалист ТС пытался отсечь некорректный ввод. Правда, сделал он это криво
А отрицательные числа возникают из-за переполнения, о чем выше писали.
0
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 20
07.02.2019, 09:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
main()
{
    int a=0,b=1,c,n;
    scanf("%d",&n);
    if(n==0)printf("0");
    else if(n==1)printf("1");
    else
    {
        for(int i=2;i<=n;i++)
        {
            c=a+b;
            a=b;
            b=c;
        }
        printf("%d",c);
    }
}
Всё проще намного.
0
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
07.02.2019, 13:10
Georgiy1108, проще в каком отношении?
Если внимательно прочитаете условие ТС и сообщения из данной темы, то увидите, что подход аналогичный Вашему уже предлагался и пояснялось почему такой подход не способствует решению задания ТС.

Ваш код никак не подходит для решения задания, поставленного ТС.
Ваша программа выдаст абсолютно неверный результат, если попробовать найти, к примеру сотое число Фибоначчи.
Настоящее сотое число Фибоначчи = 354224848179261915075.
Ответ Вашей программы = -980107325.
0
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 20
08.02.2019, 19:49
Ну тут либо длинная арифметика, либо на питоне писать, я это написал к тому, что не обязательно хранить весь массив.

Добавлено через 48 секунд
Да точно было такое
0
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 2
13.02.2019, 02:22
Ужасный язык... Строки адекватно перезаписывать не хочет, зато написал немного по другому - стал перезаписывать (но тоже самое).
На этапе теста запустил с n=200 - код отработал 2 секунды и закончился, ничего не получив. Пару раз так запустил - ничего.
Подождал минутку - начал запускать по порядку:
100 - работает.
120 - работает.
150 - работает.
180 - работает.
190 - работает.
200 - работает.
9999 - работает.
Оп, что? 200 уже работает? Вот как это обьяснить? Почему он сразу не захотел работать?
Вообще интересно, что скажет знающий человек по поводу такого кода.

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
#include <iostream>
#include <cstring>
using namespace::std;
    string sum(string p1, string p2)
    {
        if(p1.length()!=p2.length())
        {
            p1="00"+p1; 
        }
        else
        {
            p1="0"+p1;
        }
        p2="0"+p2;
        char* arr1=new char[p1.length()];
        strcpy(arr1, p1.c_str());
        char* arr2=new char[p2.length()];
        strcpy(arr2, p2.c_str());
        char* arr3 =new char[p2.length()];
        strcpy(arr3, p2.c_str());
        
        int it=p2.length(), opit=it-1, tmp=0, op1=0, op2=0;
        while(it!=0)
        {
            op1=(int)arr1[opit]-48;
            op2=(int)arr2[opit]-48;
            
            tmp+=(op1+op2);
            
            arr3[opit]=(tmp%10)+48;
            tmp/=10;
            
            it--;
            opit--;
            
        }
        string h;
        if(arr3[0]=='0')
        {
            for(int i=0;i<(p2.length()-1);i++)
            {
                arr3[i]=arr3[i+1];
            }
            h = string(arr3, p2.length()-1);
        }
        else
        {
            return arr3;
        }
        return h;
    }
    
int main()
{
    string a,b,c;
    int n;
    do
    {
        cin>>n;
    }while(n<1);
    if(n==1)
    {
        cout <<0;
        return 0;
    }
    else{
        if(n==2)
        {
            cout<<1;
            return 0;   
        }   
    }
    a = "1";
    b = "1";
    for(int i=2; i<n; i++)
    {
        c = sum(a, b);
        a=b;
        b=c;
                
    }
    cout <<c;
    return 0;
}
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
13.02.2019, 14:06
Цитата Сообщение от Crabintron Посмотреть сообщение
Вообще интересно, что скажет знающий человек по поводу такого кода.
Что его писал извращенец, причем в плохом смысле.
Сложение идет через представление чисел строками. Ладно бы еще массивом цифр, но строками!
Внутри функции сложения выделяется память аж под 3 строки (зачем???), а потом не освобождается. У вас что, память девать некуда?

Добавлено через 1 час 8 минут
Вариант с ручной реализацией длинных целых:
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
#include <stdio.h>
#include <inttypes.h>
#include <string.h>
 
#define LONG_SIZE 1000
 
typedef struct LongNum{
  uint8_t data[LONG_SIZE];
}LongNum_t;
 
void LongSet( LongNum_t *x, uint8_t val){
  memset( &(x->data), 0, LONG_SIZE);
  x->data[0] = val;
}
 
void LongSum( LongNum_t *a, LongNum_t *b, LongNum_t *res ){
  uint16_t temp = 0;
  for(uint16_t i=0; i<LONG_SIZE; i++){
    temp += a->data[i] + b->data[i];
    res->data[i] = temp & 0xFF;
    temp >>= 8;
  }
  if(temp != 0)fprintf(stderr, "OVF!!!\n");
}
 
uint8_t LongDivMod10( LongNum_t *a, LongNum_t *res, uint8_t *num){
  uint16_t temp = 0;
  uint8_t zero = 1;
  for(int16_t i=(LONG_SIZE-1); i>=0; i--){
    temp = (temp << 8) | a->data[i];
    res->data[i] = temp / 10;
    temp %= 10;
    if(res->data[i] != 0)zero = 0;
  }
  *num = temp;
  return zero;
}
//рекурсивный вывод: мне лень было переводить в строку по-человечески
void LongOut(LongNum_t *x){
  uint8_t num = 0;
  if(!LongDivMod10(x, x, &num)){
    LongOut(x);
  }
  printf("%i", num);
}
 
int main(){
  LongNum_t a, b;
  LongNum_t *x=&a, *y=&b, *t;
  LongSet(x, 0);
  LongSet(y, 1);
  int n;
  scanf("%i", &n);
  for(int i=0; i<n; i++){
    LongSum(x, y, x);
    t=x; x=y; y=t;
  }
 
  printf("%i -> ", n);
  LongOut(x);
  printf("\n");
}
Результаты:

1 -> 1
3 -> 2
6 -> 8
10 -> 55
20 -> 6765
50 -> 12586269025
100 -> 354224848179261915075
500 -> 1394232245616978801397243828704072839500 7025658769730726410896294832557162286329 0691557658876222521294125
1000 -> 4346655768693745643568852767504062580256 4660517371780402481729089536555417949051 8904038798400792551692959225930803226347 7520968962323987332247116164299644090653 3187938298969649928516003704476137795166 849228875
2000 -> 4224696333392304878706725602341482782579 8528402506810980102801373143085843701307 0722412359963914151108844608753890960360 7640194711643596029271983312598737326253 5558026069915859152294924539049987222567 9531698287448247299226390183371677806060 7011615497886719879858311468870876264597 3690867228840236544222952433479644801395 1534956297208765265606952980649984197744 8720155612802665404554171717881930324025 204312082516817125
5000 -> 3878968454388325633701916308325905312082 1277146462451061605972148955501390440370 9701082291646221066947929345285888297381 3483102008954982940361430156911478938364 2165639441069102145056341337065586562382 5465670071252592990385493381392883637834 7518908762970712033337052923107693008518 0938498018038478139967488817655546537882 9164426891298038461377896902150229308247 5666346224923071883324803280375039130352 9033045058427011476352422702109346376991 0400671417488329842289149127310405432875 3298044273676822977244987749874555691907 7038806370468327948113589737399931101062 1930814901857081539785437919530561751076 1053075688783766033667355445258844886241 6192105534574936758978490279882343510235 9984466393485325641195222185956306047536 4645470760330902420806382584929156452876 2915757591423438091423029174910889841552 0985443248659407979357131684169286803954 5309545388698114665082066862897420639323 4384884652409887423958738019769938203171 7420893226546887936400263079778005875912 9671389634214252579116872755600360311370 5477547246046399875880469851784086743828 63125
10000 -> 3364476487643178326662161200510754331030 2148460680063906564769974680081442166662 3681555955136337340255820653326808361593 7373479048386526826304089246305643188735 4544369559827491606602099884183933864652 7313000888302692356736131351175792974378 5441375213052050434770160226475831890652 7890855154366159582987279682987510631200 5754287834532155151038708182989697916131 2785626503319548714021428753269818796204 6936097879900350962302291026368131493195 2756302278376284415403605844025721143349 6118002309120828704608892396232883546150 5776583271252546093591128203925285393434 6209042452489294039017062338889910858410 6518317336043747073790855263176432573399 3712871937587746897479926305837065742830 1616374089691784263786242128352581128205 1637029808933209990570792006436742620238 9783111470054074998459250360633560933883 8319233867830561364353518921332797329081 3373264265263398976392272340788292817795 3580570993691049175470808931841056146322 3382174656373212482263830921032977016480 5472624384237486241145309381220656491403 2751086643394517512161526545361333111314 0424368548051067658434935238369596534280 7176877532834823434555736671973139274627 3629108210679280784718035329131176778924 6590899386354593278945237776744061922403 3763867400402133034329749690202832814593 3418826817683893072003634795623117103101 2919531697946076327375892535307725523759 4378843450406771555577905645044301664011 9462580972216729758615026968443146952034 6149322911059706762432685159928347098912 8470674086200858713501626031207190317208 6094081298321581077282076353186624611278 2455372085323653057759564300725177443150 5153960090516860322034916322264088524885 2433158051534849622434848299380905070483 4824493274537326245677558790891871908036 6205800959474315005240253270974699531877 0724376825907419939632265984147498193609 2852239450397071654431564213281576889080 5878318340491743455627052022356484649519 6112460268313970975069382648706613264507 6650746115126775227486215986425307112984 4118262266105716351506926002986170494542 5047491378115154139941550671256271197133 2527636319396069028956502882686083622410 8205056243070179497617112123306607331005 9947366875
11520 -> 1542164414654457324064849007442033848246 8504978285591203051598191082686363546688 9851693383068332752977342925071669931303 9448167692494794733440820258925344931644 8002080188543398794134447459938542286470 4198217404236962599412356972215288007581 0538696636209110020583942191223043131631 6338188752194734223960595814563195209121 5054226947224045268019644260597875135225 8418071465708666978776973519605700169615 2378834866191564322561236153322001522039 3035540320009848011968537270513428883848 2885293328606796062918268752746946855338 7120574575090336630024193142123702671783 4157738326035331997651524442592371874737 4194816328351349810119571810881940752819 9976158165030919676330276956698908925631 9981383522697595355103161721037512524840 3253738366150085733499934196222299871040 3331730870822386838310124191774907896299 1360112734919735755592217796440195220667 2557099441577792728191695707572159770312 0162953159775375397192610153870460198055 7805335730848786477787555780813264476413 2023107773978490888963216055777388581979 1838828585288633960149407149762231870302 7004049291154382461852282301914354270682 0697932912576838692937765925591966333077 6836925832514299544563555278366914746703 4874894184091602283676672014018372183936 2289489511581489033773005161994858419936 6444937730017675270578128929568737521499 8411232094926608883934882589513276536626 8137749787850504104556006212201416969622 2774266728032622474785645676145297938640 9586052547801310449370348312848023895031 9900069816897811277920338620694121367048 8174982387652299142800104730310417558977 7571049371250455208456747470135268806504 7753757387603885290410004455723489244642 7413626521028810891137018291329993484577 5092162680306771482238953314869212084948 2323499151500983094040054382352314533672 3691659997496849683340482900633458756261 3358861511546106565239552939157959797108 3332749980802849034501945876063222319746 5785714511054992418682588962730515990099 0210947634112268335351174766137930261587 6054668342013978594176286935619109455711 4258579382252536275536184158938464408766 8383433127908614251955508659987041856799 7546015639902517964045318753410823683186 1849535424921245057792063996798374041775 2168118221540587848947542385319019482858 4602512147387831567243160820173494582252 7840702203148083582355034601357343113930 1137182568166512888343183364490878984785 2659561711408182043541528957625297134796 5076078377382963609382353046313928164398 4591917298202089512502878318405260451485 50896640
Выше 11524 начинается переполнение.

Code
1
2
3
4
5
$ time ./a.out <<< "10000" > /dev/null
 
real    0m0,074s
user    0m0,074s
sys     0m0,000s
Добавлено через 5 минут
Проверяем код Crabintron'а:
Code
1
2
3
4
$ g++ main.cpp -Os -Wall -Wextra -Wpedantic
main.cpp: In function ‘std::__cxx11::string sum(std::__cxx11::string, std::__cxx11::string)’:
main.cpp:40:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int i=0;i<(p2.length()-1);i++)
Согласен, не самая критичная ошибка, попробуем запустить (изменил вывод аналогично своему для удобства копипаста из консоли):
Code
1
2
3
4
5 -> 5
10 -> 55
20 -> 6765
100 -> 354224848179261915075
Пока все нормально, но ведь ограничение до 10000
Code
1
2
3
4
5
6
7
$ ./a.out 
185
185 -> 205697230343233228174223751303346572685
$ ./a.out 
186
free(): invalid pointer
Аварийный останов
Вот и все. Выше 185 оно не считает. Хотя это связано скорее всего с размером доступной памяти, но все равно далеко до 10000
2
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 2
14.02.2019, 02:49
COKPOWEHEU, Хм, но в первый раз, по стичению каких-то обстоятельств, результат на n=9999 был получен. Интересно, как такое вообще получилось .) Но суть вашей мысли я понял, благодарю.

Добавлено через 10 часов 29 минут
Хм, вроде бы все легко, но почему temp >>= 8; выполняет роль сдвига на 1 разряд в 10ричноый системе?

Добавлено через 42 минуты
Вообще у вас странный код, вы тоже извращенец, хоть и другой масти. Ваш код излишне перебирает ненужные элементы.
Я тут немного переделал код, с учетом ваших замечаний.
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
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace::std;
int flag=1;
    int* sum(int* arr1, int* arr2)
    {
        int tmp=0;
        int i=0;
        
        for(; i<flag;i++)
        {
            tmp+=(arr1[11100-i]+arr2[11100-i]);
            
            arr1[11100-i]=tmp%10;
            tmp/=10;
        }
        if(tmp)
        {
            arr1[11100-i]=tmp;
            flag++;
        }
        
        return arr1;
    }
    
int main()
{
    clock_t t;
    t=clock();
    int* arr1;
    int* arr2;
    int* arr3;
    int n;
    /*do
    {
        cin>>n;
    }while(n<1);*/
    n=10000;
    if(n==1)
    {
        cout <<0;
        return 0;
    }
    else{
        if(n==2)
        {
            cout<<1;
            return 0;   
        }   
    }
    arr1=(int*)malloc(11101*sizeof(int));
    arr2=(int*)malloc(11101*sizeof(int));
    arr3=(int*)malloc(11101*sizeof(int));
    arr1[11100]=1;
    arr2[11100]=1;
    for(int i=2; i<n; i++)
    {
        arr3 = sum(arr1, arr2);   
        arr1=arr2;
        arr2=arr3; 
    }
    cout<<(float)(clock()-t)/CLOCKS_PER_SEC<<endl;
    for(int i=(11101-flag); i<11101; i++)
    {
        cout<<arr3[i];
    }
    return 0;
}
PS: Знаю, забыл освободить память.
А еще можно выдиление памяти поменять с 11101 на n и тогда код будет работать для всех значений, пока физическая память позволяет и при этом на низких значениях будет экономия памяти, под вычисление 10 числа не будет выделяться столько памяти .) А поменять именно на n потому-что при сложении 2 чисел длинна выходного числа может быть длиннее только на 1 разряд. Может есть и более точные алгоритмы вычисления количества цифл в числе фибаначчи, но я такого не знаю.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
14.02.2019, 09:35
Цитата Сообщение от Crabintron Посмотреть сообщение
Хм, вроде бы все легко, но почему temp >>= 8; выполняет роль сдвига на 1 разряд в 10ричноый системе?
Я не в десятичной системе считаю, а в двоичной, точнее в 256-ричной. Один элемент массива - одна цифра от 0 до 255. Потому и сдвиг на 8 бит это сдвиг на 1 разряд.
Цитата Сообщение от Crabintron Посмотреть сообщение
arr3=(int*)malloc(11101*sizeof(int));
...
arr3 = sum(arr1, arr2);
Так делать нельзя. Вы выделили память, но тут же меняете указатель на arr1. В результате к памяти, выделенной изначально, нет никакого доступа. Ну и да, не забывайте проверять успешность выделения памяти и освобождать вовремя.
Цитата Сообщение от Crabintron Посмотреть сообщение
Ваш код излишне перебирает ненужные элементы.
Где? Если речь про сложение, то функции обязаны перебирать все элементы, они же не знают что им подсунут.
Цитата Сообщение от Crabintron Посмотреть сообщение
А еще можно выдиление памяти поменять с 11101 на n и тогда код будет работать для всех значений, пока физическая память позволяет и при этом на низких значениях будет экономия памяти, под вычисление 10 числа не будет выделяться столько памяти .)
У вас выделяется 260 кБ. Ну ладно, если убрать выделение для arr3, которое здесь не нужно, будет 173 кБ.
Для сравнения, в моей версии выделяется примерно 2 кБ - на два порядка (десятичных) меньше!
По скорости счета мой метод тоже чуть лучше: за одну операцию складываются две 8-битных цифры, в то время как в вашем одна 10-ричная, это примерно в 2.5 раза разница. Вот при вводе-выводе ваш метод проще, поскольку нет необходимости деления.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2019, 09:35
Помогаю со студенческими работами здесь

Используя цикл while или do вычислить числа Фибоначчи до заданного значения
С помощью цикла «пока» или цикла «до» написать программу вычисления числа Фибоначчи, не превосходящего заранее заданное число N.

Заменить все отрицательные числа на их абсолютные значения
В таблице из 20 чисел,лежащих в промежутке от -50 до 50,заменить все отрицательные числа на их абсолютные значения. заранее спасибо)

В матрице заменить все отрицательные числа на их абсолютные значения
В матрице A(5,5) заменить все отрицательные числа на их абсолютные значения.

Изменить программу так, чтобы она выводила значения числа Фибоначчи по введённому числу
Помогите надо изменить эту программу так чтобы она выводила значения числа Фибоначчи по введённому числу. А не до какого числа как в этой...

Возвести в квадрат те числа, значения которых неотрицательны, и в четвертую степень — отрицательные
1. Даны три действительных числа. Возвести в квадрат те из них, значения которых неотрицательны, и в четвертую степень — отрицательные. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru