Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
yaStudent
2 / 2 / 0
Регистрация: 31.05.2014
Сообщений: 35
#1

Арифметические операции, сумма ряда - C++

04.06.2014, 11:01. Просмотров 476. Ответов 9
Метки нет (Все метки)

Исправить и объяснить

Прошу о помощи.

Первая задача, выводит неверный результат:
Кликните здесь для просмотра всего текста
Циклом с параметром должна выполняться формула:
1/(1+1/2)/(2+4/8)...(n+2^n/n+1)
n вводится с клавиатуры
надо получить конечный результат
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
int main()
{
  double n;
  cin>>n;
  double res=1.;
  double pow2=2.;
  for(int i=1;i<=n;i++)
  {
     res/=(i+pow2/(i+1));
     pow2*=2.;
  }
  cout<<res;
}
Вот замечание:
Решение не верно. Не верно записал формулы для вычисления. Такие задачи раскручивают с конца, с последней дроби: n+2^n/n+1
Для ее вычисления у вас все известно. А для вычисления самой верхней дроби известен только числитель. А ее знаменатель вычисляется через вложенную цепочку всех остальных дробей.


Вторая задача (с ней всё в порядке):
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
using namespace std;
 
int main()
{
    int        a, d, m, n, f = 0;
 
    
cin >> d;
 
    for ( a = d, m = n = 1; a /= 10; m *= 10, n++ );
 
    a = d;
    n /= 2;
    while ( n-- ) {
        f |= ((d / m) % 10) ^ (a % 10);
        m /= 10;
        a /= 10;
    }
 
    cout << (!f ? "Yes" : "No") << endl;
 
    return 0;
}

Необходимо подробно объяснить работу обоих программ, вот замечание:
При описании решения задачи следует отдельно выделить постановку задачи с указанием входных и выходных данных и метод решения задачи
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2014, 11:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Арифметические операции, сумма ряда (C++):

Быстрые арифметические операции - C++
Здравствуйте. Я знаю, что в си++ есть понятие быстрых арифметических операций (не могу вспомнить термин). Т.е. не нужно писать i = i +1,...

Арифметические операции. Дополнительный код - C++
суть проблеммы в следующем. лаба. Операции с числами в доп. коде (доп. код - то каким способом хранятся целые числа на...

Арифметические операции с двоичными числами - C++
Вопрос такой. Вот задание: Двоичные числа (разбор строки, формирование строки, операции сложения, вычитания, разные варианты вывода...

Арифметические операции. Комплексные числа - C++
Была поставлена задача: class Complex Смешанная арифметика ( перегрузка операторов) Как я понял я должен перевести выражение из...

Арифметические операции с элементами массива - C++
Объявить целочисленный массив L . Используя цикл for (i = ... .. ..) {...} ввести значения элементов массива с клавиатуры. Объявить массив...

Арифметические операции в консольном приложении - C++
program Project5; {$APPTYPE CONSOLE} uses SysUtils; Label 1; Var a,b,c,E,Fa,Fb,Fc:real; Lich:Integer;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ogniel
24 / 24 / 1
Регистрация: 30.05.2011
Сообщений: 127
04.06.2014, 13:34 #2
по первой задачке
как было сказано, такие формулы раскручивают с конца, => цикл тебе нужно задать в обратном порядке

C++
1
for (int i=n; i>=0; i--);
и в итоге, i[n-1] делим на i[n]

C++
1
res=(i+pow2/(i+1))/res;
не забыв перед циклом присвоить res=1;

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
double res=1.;
for (int i=n; i>=0; i--)
{
res=(i+pow2/(i+1))/res;
}
cout<<res;
jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 519
Завершенные тесты: 1
04.06.2014, 13:45 #3
ну что бы такому условию соответствовало
Цитата Сообщение от yaStudent Посмотреть сообщение
(n+2^n/n+1)
, то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath> 
using namespace std;
 
int main()
{
  double n;
  cin>>n;
  double res=1.;
  for(int i=1;i<=n;i++)
  {
     res/=(i+pow(i, 2)/(i+1));// здесь pow(i, 2) - возносим в степень
    
  }
  cout<<res;
}
yaStudent
2 / 2 / 0
Регистрация: 31.05.2014
Сообщений: 35
04.06.2014, 13:52  [ТС] #4
цикл тебе нужно задать в обратном порядке
for (int i=n; i>=0; i--);
ну что бы такому условию соответствовало
for(int i=1;i<=n;i++)
Я запутался.
Ogniel
24 / 24 / 1
Регистрация: 30.05.2011
Сообщений: 127
04.06.2014, 14:56 #5
смотри. такие формулы строятся в обратном порядке - от n (которое ты вводишь сам) до 1 (которая статическая)
следовательно, тебе нужен цикл от n до 1 с интервалом 1. к примеру, если n=65, то массив значений i будет таким:
65, 64, 63, ... 2, 1, 0

ну и саму формулу считаем с конца (получается как бы к концу мы пошагово прибавляем начало) - res[65]/1, res[64]/res[65], res[63]/res[64]/res[65], ... , res[0]/...

так понятнее?)))
jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 519
Завершенные тесты: 1
04.06.2014, 15:13 #6
Ogniel, а разве вот эта формула 1/(1+1/2)/(2+4/8)...(n+2^n/n+1) не нарушится если в обратном порядке делать, ведь тогда получится 64/(64 + 2^64/65)/(63 + 2^63/64)...
совсем другой результат будет
Ogniel
24 / 24 / 1
Регистрация: 30.05.2011
Сообщений: 127
04.06.2014, 15:36 #7
кстати, да, ошибочку я допустил. но как известно a/b/c/d = a/(b*c*d)

C++
1
2
3
4
5
6
7
double res=1.;
for (int i=n; i>=0; i--)
{
res=(i+pow2/(i+1))*res;
}
res=1/res;
cout<<res;
yaStudent
2 / 2 / 0
Регистрация: 31.05.2014
Сообщений: 35
05.06.2014, 09:02  [ТС] #8
Осталось определиться с одним вопросом, в отношении первой задачи.
При описании решения задачи следует отдельно выделить постановку задачи с указанием входных и выходных данных и метод решения задачи
Добавлено через 12 часов 28 минут
Актуально.
Renji
1901 / 1299 / 291
Регистрация: 05.06.2014
Сообщений: 3,718
05.06.2014, 10:53 #9
Цитата Сообщение от Ogniel Посмотреть сообщение
смотри. такие формулы строятся в обратном порядке - от n (которое ты вводишь сам) до 1 (которая статическая)
В обратном порядке записывается цепочка сложений, по причине того что числа имеют внутреннее представление вида мантисса*2^экспонента. Когда эти экспоненты различаются, младшие разряды мантиссы меньшего слагаемого отбрасываются. Чтобы отбрасывалось не слишком много, числа нужно складывать в порядке возрастания. Обсуждаемой цепочке делений на это глубоко пофиг, так как она работает по принципу "поделили мантиссы, вычли экспоненты друг из друга, нормализовали результат".

Другое дело что нужно сначала перемножить между собой все (n+2^n/n+1), а уж потом поделить единицу на результат. Во-первых, ошибок округления меньше, во-вторых, это банально быстрее (деление тормознутое).
yaStudent
2 / 2 / 0
Регистрация: 31.05.2014
Сообщений: 35
05.06.2014, 16:33  [ТС] #10
Актуально...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2014, 16:33
Привет! Вот еще темы с ответами:

Арифметические операции с элементами файлов - C++
Для двух файлов А и В, которые включают по 17 элементов A={ai }, B={bi} i=1,17 необходимо выполнить следующие действия с элементами ai и ...

Арифметические операции, найти ошибку в коде - C++
Где ошыбка? #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { double mult = 1; int n = 1; ...

Арифметические операции над элементами массива - C++
Дан массив. Все его элементы: уменьшить на 30, умножить на последний элемент, увеличить на число B.

Реализовать 4 функции на простейшие арифметические операции (+,-, *, /) - C++
Начал изучать указатели. Вошёл туго. Очень хочу разобраться самостоятельно, но задачи сдавать тоже нужно. Прошу помощи в решении задачи. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.06.2014, 16:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru