Умножение полиномов в с ++ - PullRequest
0 голосов
/ 24 ноября 2018

Я ввожу массив, и код должен умножить этот массив на (x^2 + 2*A*X + A^A).например, массив 1, 3, 3, 1 должен иметь ответ 1, 5, 10, 10, 5, 1, если A = 1.Я пытался написать код, но я понятия не имею, как я должен умножать многочлены в C ++.

CODE

#include "pch.h"
#include <iostream>

int main()
{
int a, n;

std::cout << "Enter the Power n: "; //Power decides the size of array.
std::cin >> n;

std::cout << "Enter the number A: ";
std::cin >> a;

int arr_size = n + 1;       

int *array = new int[2 * arr_size];

std::cout << "Enter the array P(X): ";

for (int i = 0; i < arr_size; i++)
{
    std::cin >> array[i];
}

for (int i = 0; i < arr_size; i++)
    std::cout << array[i] << " ";

const int x = 1;
for (int i = 0; i < arr_size; i++) {
    array[i] = array[i] * x ^ 2;
    array[i] = array[i] * (2 * a*x);
    array[i] = array[i] * (a * a);

    std::cout << array[i] << " ";
}
return 0;
}

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Мне кажется, что проблему, которую вы можете решить с помощью std::valarray

Я имею в виду ... если ваш array равен

std::valarray<int>  array(arr_size);

следующий, вы можете просто написать

array *= x*x + 2*a*x + a*a;

Не по теме предложение: вы используете C ++ 11, поэтому, пожалуйста, избегайте прямого управления вашей динамической памятью.

В вашем коде вы выделили массив

int *array = new int[2 * arr_size];

но вы не удалили его.

Используйте, когда это возможно, стандартные контейнеры (std::valarray, но также std::vector), а когда вам нужно управлять динамической памятью, используйте умный указатель (std::unique_ptr, std::shared_ptr и т. Д.).

0 голосов
/ 24 ноября 2018
#include <iostream>
#include <vector>

int main() {
    // coefs before multiplying by powers of A
    std::vector<int> a = {1,2,1};

    // make polynomial coefs vector
    int A = 1;
    const int as = a.size();
    int ap = 1;
    for(int ai = 0; ai<as; ++ai){
        a[ai] *= ap;
        ap *= A;
    }

    std::vector<int> b = {1,3,3,1};
    const int bs = b.size();

    // result vector
    std::vector<int> c(as + bs - 1, 0);

    // multiply vectors
    for(int ai = 0; ai<as; ++ai)
        for(int bi = 0; bi<bs; ++bi){
            c[ai+bi] += a[ai]*b[bi];
        }

    for(int cn: c)
       std::cout << cn << ' ';
    return 0;
}
0 голосов
/ 24 ноября 2018

Вы должны использовать выходной массив для этого и правильно умножить свои результаты.

Я считаю, что индекс = полиномиальный показатель (т. Е. [0] для x**0):

std::vector<int> array(arr_size, 0);

std::cout << "Enter the array P(X): ";

for (int i = 0; i < arr_size; i++)
{
    std::cin >> array[i];
}

for (int i = 0; i < arr_size; i++)
    std::cout << array[i] << " ";
std::cout << std::endl;

std::vector<int> out(arr_size+2, 0); // We add two new coefficients

for (int i = 0; i < arr_size; i++) {
    out[i+2] += array[i]; // bumps the coefficient for x**2
    out[i+1] += array[i] * (2 * a); // add the coefficient for 2ax
    out[i] += array[i] * (a * a); // Adds the coefficient for a**2

}
for(int coeff: out)
    std::cout << coeff << " ";
std::cout << std::endl;
...