Последовательность чисел

Мне нужно создать программу, где в результате я получу n-й номер или последовательность. Последовательность выглядит так:

(-10, 5, -2,5, 1,25, -0,625...)

#include <iostream>

using namespace std;

double count (double n)
{
    if (n==1)
        return -10;
    else
        return (-10/((n-1)*(-2)));
}

double n;

main()
{
cout<<"n? : ";
cin>>n;
cout<<count(n);
return 0;
}

Для меня все выглядит хорошо для меня, когда я даю программе 1, это дает -10, когда я даю 2, это возвращает 5, но на 3 это дает 2,5, а не -2,5, на 4 это дает 1.(6), что не имеет смысла для меня. Где ошибка в этом коде?

3 ответа

Решение

Эффективный (оптимизированный код) код для вашего вопроса будет:

#include <iostream>
#include<math.h>
using namespace std;

double count (double n)
{
  double x = pow(2, n - 1);      //calculate the divisor
  return pow(-1, n) * (10 / x);  // divide 10 with divisor followed by assigning it  a sign
}

int main()
{
  int n;
  cout<<"n? : ";
  cin>>n ;
  cout<<count(n) << endl;
  return 0;
}

Примечание. Избыточность возникает из-за ветвления в вашем коде. Лучше старайтесь писать прямой код (без слишком большого количества ветвлений) везде, где это возможно.

Когда вы даете n=3, (-10/((n-1)*(-2))) дает тебе (-10/((3-1)*(-2))) = 2.5, Мое предложение будет возвращаться (10/((n-1)*2)) * sign(n), где sign(n) вернуть 1, если n четное, и вернуть -1 в противном случае.

Я думаю, что ваша проблема имеет действительно хорошее и простое рекурсивное решение:

double count(int n){
    if (n <= 1) return -10;
    return count(n - 1)*-0.5;
}

Пример вызова:

#include <iostream>
#include <iomanip>

int main(){
    for (int i = 1; i < 20; ++i){
        std::cout << std::setw(15) << count(i) << std::endl;
    }

    return 0;
}

выход:

            -10
              5
           -2.5
           1.25
         -0.625
         0.3125
       -0.15625
       0.078125
     -0.0390625
      0.0195313
    -0.00976563
     0.00488281
    -0.00244141
      0.0012207
   -0.000610352
    0.000305176
   -0.000152588
   7.62939e-005
   -3.8147e-005
Другие вопросы по тегам