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

Рейтинг: 0Ответов: 1Опубликовано: 07.05.2023
#include <iostream>
using namespace std;
struct list
{
    int info;
    list* next;
    list* pred;
};
list* init()
{
    int x;
    list* p;
    list* h = new(list);
    cout << "Enter elem" << endl;
    cin >> x;
    h->info = x;
    h->next = NULL;
    h->pred = NULL;
    p = h;
    cout << "Enter elem" << endl;
    cin >> x;
    while (x != 0)
    {
        list* q = new(list);
        q->info = x;
        q->next = NULL;
        q->pred = p;
        p->next = q;
        p = q;
        cout << "Enter elem" << endl;
        cin >> x;
    }
    return h;
}
void print(list* p)
{
    while (p != NULL)
    {
        cout << p->info << " ";
        p = p->next;
    }
}
bool fib(int b)
{
    int f1, f2, f3;
    f1 = 1;
    f2 = 1;
    while (b > f1)
    {
        f3 = f1 + f2;
        f1 = f2;
        f2 = f3;
    }
    if (b == f1) return true;
    else return false;
}
int sum(list* p)
{
    int s = 0;
    while (p != NULL)
    {
        while (p->info > 0)
        {
            s += p->info % 10;
            p->info /= 10;
        }
        p = p->next;

    }
    return s;
}
list* ins(list* p, int s)
{
    list* r = p;
    p = p->next;
    while (p != NULL)
    {
        if (fib(p->info))
        {
            list* q = new(list);
            q->info = s;
            q->pred = p->pred;
            q->next = p;
            p->pred->next = q;
            p->pred = q;
        }
        p = p->next;
    }
    if (fib(r->info))
    {
        list* q = new(list);
        q->info = s;
        q->next = r;
        r->pred = q;
        q->pred = NULL;
        r = q;
    }
    return r;
}

void main()
{
    int x;
    list* h = init();
    double t = sum(h);
    ins(h, t);
    print(h);
}

Написала программу, но она почему то выводит 0. Подскажите где ошибка и как ее исправить?

Ответы

▲ 1Принят

Вы сначала обнуляете данные списка сами с помощью вызова sum и модификацией чисел с помощью p->info /= 10;. Даже если сначала использовать вспомогательную переменную с числом, это не поможет, так как в задаче было считать не все цифры в списке, а только данного числа, которое было Фибоначчи.

int sum(list* p){
    int s = 0;
    while (p != NULL)    {
      int pi = p->info ;
        while (pi > 0)        {
            s += pi % 10;
            pi /= 10;
        }
        p = p->next;
    }
    return s;
}

Программу надо будет ещё полностью переписать, чтобы правильно выполнить.