Последовательность чисел
Мне нужно создать программу, где в результате я получу 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