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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2021, 23:52   #1
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию Суперпозиция полиномов без классов и векторов с++

Здравствуйте, начал писать для полиномов калькулятор и нашел такое действие как суперпозиция, и вот в интернете о ней мало информации я нашел какую-то рекуррентную формулу, но что-то НЕ вийшло.Вхидни данные например 2 полиномы 2 + х и результат 4 + х, то есть 2 + (2 + х)
Код:
void s(int* a, int n, int* b, int m, int* result, int& nm) 
{
    nm = n + m;
    for (int k = 0; k <= nm; k++)
    {
        result[k] = 0;
        for (int i = 0; i <= n; i++)
            for (int j = 0; j <= m; j++)
                if (i + j == k)
                    result[k] += a[i] * b[j];
    }
}
Как исправить буду благодарен за помощь
sobaka13 вне форума Ответить с цитированием
Старый 22.04.2021, 23:53   #2
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

Еще прочитал что вроде можно как-то через функцию умножение и схеми Горнера ну у меня есть ети функции но не понимаю как они помогут для суперпозиции
Код:
double gorner(int* arr, int n, int x)
{
	double p = 0;
	for (int i = 0; i <= n; i++)
	{
		p = p * x + arr[n - i];
		cout << i << " : " << p << endl;
	}

	return p;
}void mull(int* arr1, int n, int* arr2, int m, int* result, int& nm)
{
	nm = n + m;
	for (int i = 0; i <= nm; i++)
	{
		result[i] = 0;
	}
	for (int i = 0; i <= nm; i++)
	{
		for (int j = 0; j <= m; j++)
		{
			if (i - j >= 0 && i - j <= n)
				result[i] += arr1[i - j] * arr2[j];
		}
	}
}
sobaka13 вне форума Ответить с цитированием
Старый 23.04.2021, 06:04   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Код:
#include <iostream>

using namespace std;

void print(int* arr, int n)
{
    bool no_print = true;
    for (int i = n; i >= 0; i--)
    {
        if (!arr[i])
        {
            continue;
        }
        if (arr[i] > 0)
        {
            if (i != n && !no_print)
            {
                cout << "+";
            }
        }
        no_print = false;
        cout << arr[i];
        if (i)
        {
            cout << "*x";
        }
        if (i > 1)
        {
            cout << "^" << i;
        }
    }
    if (no_print)
        cout << "0";
}

void mull(int* arr1, int n, int* arr2, int m, int* &result, int &nm)
{
    nm = n + m;
    result = new int[nm + 1];
    for (int i = 0; i <= nm; i++)
    {
        result[i] = 0;
    }
    for (int i = 0; i <= nm; i++)
    {
        for (int j = 0; j <= m; j++)
        {
            if (i - j >= 0 && i - j <= n)
                result[i] += arr1[i - j] * arr2[j];
        }
    }
}

void superposition(int* arr1, int n, int* arr2, int m, int* &result, int &nm)
{
    int* tmp_arr = new int[1];
    tmp_arr[0] = 0;
    int tmp_n = 0;

    for (int i = 0; i <= n; i++)
    {
        int* res_tmp;
        int res_n;

        /* DEBUG PRINT
        cout << "(";
        print(tmp_arr, tmp_n);
        cout << ") * (";
        print(arr2, m);
        cout << ") = ";
        */
        mull(tmp_arr, tmp_n, arr2, m, res_tmp, res_n);
        /*
        print(res_tmp, res_n);
        cout << endl;
        */
        res_tmp[0] += arr1[n - i];

        delete[] tmp_arr;
        tmp_arr = res_tmp;
        tmp_n = res_n;
    }

    result = tmp_arr;
    nm = tmp_n;
}

int main()
{
    int a[2] = {2, 1};
    int n = 1;
    int b[3] = {2, 1, 3};
    int m = 2;
    int* res;
    int nm;
    cout << "(";
    print(a, n);
    cout << ") * (";
    print(b, m);
    cout << ") = ";
    mull(a, n, b, m, res, nm);
    print(res, nm);
    delete[] res;
    cout << endl;
    cout << "f(x) = ";
    print(a, n);
    cout << endl << "g(x) = ";
    print(b, m);
    superposition(a, n, b, m, res, nm);
    cout << endl << "f(g(x)) = ";
    print(res, nm);
    cout << endl;
    delete[] res;
    return 0;
}
Вроде работает, но особо не тестил. И можно сделать красивее, а не выделять постоянно память под полиномы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 23.04.2021, 08:37   #4
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

@BDA
Цитата:
Сообщение от BDA Посмотреть сообщение
mull(tmp_arr, tmp_n, arr2, m, res_tmp, res_n);
visual studio не пропускает res_tmp (Error C4700 uninitialized local variable 'res_tmp' used )
sobaka13 вне форума Ответить с цитированием
Старый 23.04.2021, 09:14   #5
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

Ну я исправил,но виводит мусор почему-то:
Код:
void superposition(int* arr1, int n, int* arr2, int m, int* result, int& nm)
{
	int* tmp_arr = new int[1];
	tmp_arr[0] = 0;
	int tmp_n = 0;

	for (int i = 0; i <= n; i++)
	{
		int res_n;
		int* res_tmp=new int[maxN];

		/* DEBUG PRINT
		cout << "(";
		print(tmp_arr, tmp_n);
		cout << ") * (";
		print(arr2, m);
		cout << ") = ";
		*/
		mull(tmp_arr, tmp_n, arr2, m, res_tmp, res_n);
		/*
		print(res_tmp, res_n);
		cout << endl;
		*/
		res_tmp[0] += arr1[n - i];

		delete[] tmp_arr;
		tmp_arr = res_tmp;
		tmp_n = res_n;
	}

	result = tmp_arr;
	nm = tmp_n;
}

Последний раз редактировалось sobaka13; 23.04.2021 в 09:24.
sobaka13 вне форума Ответить с цитированием
Старый 23.04.2021, 09:30   #6
sobaka13
Пользователь
 
Регистрация: 22.04.2021
Сообщений: 12
По умолчанию

Исправил,все получилось,спасибо большое
sobaka13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
найти базис системы векторов и координаты все векторов в найденном базисе - Александр121 Помощь студентам 1 05.01.2018 12:49
Линейные однонаправленные списки: Для заданных полиномов Pn( x ) и Qn( x ) найти полином R, являющийся суммой полиномов P и Q Алина Шаповал Паскаль, Turbo Pascal, PascalABC.NET 2 23.02.2014 16:39
переделать программу без использования векторов Ника К Помощь студентам 0 06.06.2012 21:58