У меня есть класс полиномов, который предлагает пользователю ввести значения, которые будут помещены в вектор целых чисел (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;
}
Если у вас есть этот вектор, где пользователь вводит значение коэффициента, вы можете пройти вектор от индекса 0 до последнего элемента (при условии, что пользователь введет значение коэффициента в правильном порядке), и просто сохранить значение последнего индекса, значение которого не ноль.
int degreeOfPolynomial=0;
for(int i=0 ; i < vect_poly.size() ; i++)
{
if(vect_poly[i] != 0)
degreeOfPolynomial = i;
}
После выполнения вышеуказанной части кода, degreeOfPolynomial будет хранить правильное значение степени полинома.
Почему бы просто не следить за этим?
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++;
}
Я вижу два варианта:
Просто скопируйте входные данные в вектор, затем найдите последний ненулевой и урежьте вектор после этого.
Скопируйте ввод во временный вектор, и каждый раз, когда вводится ненулевое значение, перемещайте-добавляйте временный вектор к 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. Вы также можете сохранить 0
s в счетчике:
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;
}
}
Вы можете использовать локальную переменную для отслеживания максимального значения, и каждый раз, когда пользователь нажимает ввод, вы сравниваете его ввод с текущим максимальным значением.
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;
}
}