Степень: полиномиальный класс (ожидаются нечетные случаи для пользовательского ввода)

У меня есть класс полиномов, который предлагает пользователю ввести значения, которые будут помещены в вектор целых чисел (vector<int> vect_poly). Я пытаюсь найти способ определения степени полинома для случаев, когда пользователь делает что-то подобное в цикле while:

0↵0↵0↵0↵4↵0↵0↵0↵0 ← x ^ 4 (степень = 4)

(ИЛИ ЖЕ)

0↵0↵0↵0↵0↵0↵0↵0↵0 ← (градус = 0)

(ИЛИ ЖЕ)

4↵0↵0↵0↵0↵0↵0↵0↵0 ← x ^ 0 (градус = 0)

(ИЛИ ЖЕ)

0↵0↵0↵0↵0↵0↵0↵0↵4 ← x ^ 8 (градус = 8)

Я действительно просто ищу хитрый алгоритм.


Как насчет этого:

 int degree()
{
int d = 0;
for ( int i = 0; i < 100; i++ )
if ( coef[i] != 0 ) d = i;
return d;
}

1

Решение

Если у вас есть этот вектор, где пользователь вводит значение коэффициента, вы можете пройти вектор от индекса 0 до последнего элемента (при условии, что пользователь введет значение коэффициента в правильном порядке), и просто сохранить значение последнего индекса, значение которого не ноль.

 int degreeOfPolynomial=0;
for(int i=0 ; i < vect_poly.size() ; i++)
{
if(vect_poly[i] != 0)
degreeOfPolynomial = i;
}

После выполнения вышеуказанной части кода, degreeOfPolynomial будет хранить правильное значение степени полинома.

0

Другие решения

Почему бы просто не следить за этим?

std::vector<int> polynomial;
int degree = 0;
int inputs = 0;
int coefficient;
while (std::cin >> coefficient)
{
polynomial.push_back(coefficient);
if (coefficient != 0)
{
degree = inputs;
}
inputs++;
}
0

Я вижу два варианта:

  1. Просто скопируйте входные данные в вектор, затем найдите последний ненулевой и урежьте вектор после этого.

  2. Скопируйте ввод во временный вектор, и каждый раз, когда вводится ненулевое значение, перемещайте-добавляйте временный вектор к vect_poly, как это:

    std::vector<int> temp;
    int n;
    while (std::cin >> n) {
    temp.push_back(n);
    if (n != 0) {
    vect_poly.insert(vect_poly.end(), temp.begin(), temp.end());
    temp.clear();
    }
    }
    

    Таким образом, вы получите все, кроме конечной нулевой последовательности в vect_poly,

РЕДАКТИРОВАТЬ

3. Вы также можете сохранить 0s в счетчике:

int n;
size_t zeroes = 0;
while (std::cin >> n) {
if (n == 0) {
++zeroes;
} else {
vect_poly.insert(vect_poly.end(), zeroes, 0);
vect_poly.push_back(n);
zeroes = 0;
}
}
0

Вы можете использовать локальную переменную для отслеживания максимального значения, и каждый раз, когда пользователь нажимает ввод, вы сравниваете его ввод с текущим максимальным значением.

int max=0;
while(1)
{
int input=0;
std::cin>>input;
if(input>max)
{
max=input;
}
}

Конечно, с некоторым условием прорыва, чтобы цикл не работал вечно. Вы можете попытаться связываться с троичным оператором в операторе if, но я не вижу в этом особой ценности.

РЕДАКТИРОВАТЬ: если вы хотите узнать последнее установленное значение (то есть степень) ранее сгенерированного, но по существу случайного вектора как можно быстрее, запустите цикл следующим образом:

int max=0;
for(int k= myvec.size()-1; k>=0; k--)
{
if(myvec[k]>0)
{
max=k;
break;
}
}
0
По вопросам рекламы [email protected]