Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2020, 15:53   #1
Karra
Новичок
Джуниор
 
Регистрация: 12.05.2020
Сообщений: 2
По умолчанию Вычислить точное значение суммы. реализация больших чисел, так как результат требуемой суммы помещается в int64, и что нужна именно структура и функции, а не класс (хотя используется C++).

вот само задание во вложении

я написал код создания большого числа, не могу понять что делать дальше, поэтому прошу помощи… вот код, который я написал, то что закомментировано это попытки решения данной задачи
Код:
#include <iostream>
#include <string.h>
#include <conio.h>
#include<cmath>
using namespace std;
struct bignumber // описание узла
{
    short digit; // цифра
    bignumber *next; // поле для связи со следующей цифрой числа
};

bignumber * create(char *str) // создание большого числа из текстовой строки
{
    bignumber *p, *top = NULL;
    int i;
    for (i = 0; i<strlen(str); i++)
        {
            p = new bignumber;
            p->digit = short(str[i]) - short('0');
            p->next = top;
            top = p;
        }
    return top;
}

void print(const bignumber * first) // рекурсивная распечатка цифр числа
{
    if (first != NULL) // если ещё не конец числа
    {
        print(first->next); //вызываем печать для старшего разряда
        cout << first->digit; //печать текущего разряда
    }
}

void clear(bignumber ** first) // очистка стека (удаление всех узлов из стека)
{
    bignumber *temp;
    while (*first != NULL) // пока не достигли конца
        {
            temp = (*first)->next; // устанавливаем указатель temp на следующий элемент
            delete *first;
            *first= temp; // переводим указатель на следующий элемент
        }
}
/*
void input_list(bignumber *&first)
{
    int n;
	first = new bignumber;
	first->digit = pow(1, 2);
	bignumber *q = first;
	for (int i = 2; i <= n ; i++)
        {
            q->next = new bignumber;
            q = q->next;
            q->digit = pow(i, 2);
        }
	q->next = 0;
}

void print_sum(bignumber *q)
 {
	unsigned long long sum=0;
	while (q)
        {
            sum+=q->digit;
            q = q->next;
        }
	cout <<"sum = "<<sum<< endl;
}*/
int main()
{
setlocale(LC_ALL, "Russian");
bignumber *first = 0;
char n[256];
cout << "Введите большое число" << endl;
cin >> n;
first = create(n);
cout << "Введенное число:" << endl;
print(first); // распечатка большого числа
cout << endl;
//input_list(first);
//print_sum(first);
cin.get();
clear(&first); // очистка
}
Изображения
Тип файла: png Безымянный.png (5.3 Кб, 16 просмотров)
Karra вне форума Ответить с цитированием
Старый 12.05.2020, 18:00   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,300
По умолчанию

Надеюсь, что требуется именно реализация больших чисел, так как результат требуемой суммы помещается в int64, и что нужна именно структура и функции, а не класс (хотя используется C++).
Код:
#include <iostream>
#include <string.h>
#include <conio.h>
#include <cmath>

using namespace std;

struct bignumber // описание узла
{
    short digit; // цифра
    bignumber *next; // поле для связи со следующей цифрой числа
};

bignumber * create_from_int_positive(int k) // только положительные числа
{
    bignumber *top;
    if (k) {
        top = new bignumber;
        top->digit = k % 10;
        top->next = create_from_int_positive(k / 10);
        return top;
    } else
        return NULL;
}

bignumber * create_from_int(int k)
{
    bignumber *top;
    if (k == 0) {
        top = new bignumber;
        top->digit = 0;
        top->next = NULL;
        return top;
    } else
        return create_from_int_positive(k);
}

bignumber * sum(const bignumber * a, const bignumber * b, int s = 0)
{
    bignumber *top;
    if (a && b) {
        top = new bignumber;
        s += a->digit + b->digit;
        top->digit = s % 10;
        top->next = sum(a->next, b->next, s / 10);
        return top;
    } else if (a) {
        top = new bignumber;
        s += a->digit;
        top->digit = s % 10;
        top->next = sum(a->next, NULL, s / 10);
        return top;
    } else if (b) {
        return sum(b, NULL, s);
    } else if (s) {
        top = new bignumber;
        top->digit = s;
        top->next = NULL;
        return top;
    } else
        return NULL;
}

bignumber * product_by_digit(const bignumber * a, int b, int s = 0)
{
    bignumber *top;
    if (a) {
        top = new bignumber;
        s += a->digit * b;
        top->digit = s % 10;
        top->next = product_by_digit(a->next, b, s / 10);
        return top;
    } else if (s) {
        top = new bignumber;
        top->digit = s;
        top->next = NULL;
        return top;
    } else
        return NULL;
}

void lshift(bignumber ** a, int c)
{
    bignumber *top;
    while (c) {
        top = new bignumber;
        top->digit = 0;
        top->next = *a;
        *a = top;
        --c;
    }
}

void print(const bignumber * first) // рекурсивная распечатка цифр числа
{
    if (first != NULL) // если ещё не конец числа
    {
        print(first->next); //вызываем печать для старшего разряда
        cout << first->digit; //печать текущего разряда
    }
}

void clear(bignumber ** first) // очистка стека (удаление всех узлов из стека)
{
    bignumber *temp;
    while (*first != NULL) // пока не достигли конца
    {
        temp = (*first)->next; // устанавливаем указатель temp на следующий элемент
        delete *first;
        *first= temp; // переводим указатель на следующий элемент
    }
}

bignumber * product(const bignumber * a, const bignumber * b)
{
    int c = 0;
    bignumber *res = create_from_int(0);
    while (a) {
        bignumber *tmp1, *tmp2;
        tmp1 = product_by_digit(b, a->digit);
        lshift(&tmp1, c);
        tmp2 = sum(res, tmp1);
        clear(&res);
        clear(&tmp1);
        res = tmp2;
        a = a->next;
        ++c;
    }
    return res;
}

bignumber * calc(int n)
{
    bignumber *tmp1, *tmp2, *tmp3, *res = create_from_int(0);
    for (int i = 1; i <= n ; i++) {
        tmp1 = create_from_int(i);
        tmp2 = product(tmp1, tmp1);
        tmp3 = sum(res, tmp2);
        clear(&tmp1);
        clear(&tmp2);
        clear(&res);
        res = tmp3;
    }
    return res;
}

int main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    cin >> n;
    bignumber *res = calc(n);
    print(res);
    cout << endl;
    clear(&res);
    cin.get();
    return 0;
}
Особо не отлаживал, могут быть ошибки. Обычное умножение в столбик.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.05.2020, 07:37   #3
Karra
Новичок
Джуниор
 
Регистрация: 12.05.2020
Сообщений: 2
По умолчанию

спасибо огромное, все работает
Karra вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить значение суммы - Pascal avatar54 Помощь студентам 3 28.06.2017 04:17
Вычислить приближенно значение бесконечной суммы pipl222 C# (си шарп) 1 26.12.2015 13:38
Вычислить приближенное значение бесконечной суммы, не используя стандартные функции, за исключением модуля. Ромун Помощь студентам 7 24.05.2015 08:33
На основе строки в виде суммы чисел создать класс,в классе написать функцию,вычисляющую результат.(Паскаль) нуб7 Помощь студентам 8 22.10.2014 20:49
добрый день. вычислить значение суммы. Vse Strogo Помощь студентам 1 21.04.2012 13:45