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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
#1

Для заданного целого числа n вычислить значение суммы - C++

05.07.2012, 14:15. Просмотров 1341. Ответов 7
Метки нет (Все метки)

Задача:
Для заданного целого числа n вычислить значение суммы:

В знаменателе сумма всевозможных комбинаций i1+i2+...+in

Для n=3
for (i1=1;i1<=n;i1++)
for (i2=1;i2<=n;i2++)
for (i3=1;i3<=n;i3++)
S+=1/(i1+i2+i3)

Какое условие нужно добавить, чтобы выполнялось для любого n? (например n=6)
Изображения
 
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2012, 14:15     Для заданного целого числа n вычислить значение суммы
Посмотрите здесь:

Вычислить произведение элементов массива S, значение которых не больше заданного негативного числа C++
Вычислить произведение элементов массива S, значение которых не больше заданного негативного числа C++
Вычислить значение целого числа C++
C++ Вычислить квадратный корень из заданного целого числа, используя только побитовые операции
Для заданного целого числа n вычислить значение суммы C++
C++ Функция, которая для заданного целого числа m находит среди первых m^2-1 чисел Фибоначчи хотя бы одно, делящееся на m (перевести на Си)
C++ Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ):
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
05.07.2012, 17:21  [ТС]     Для заданного целого числа n вычислить значение суммы #2
Вот этот код подходит? Проверте пожалуйста.
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "iostream"
#include "iomanip.h"
 
const int n = 4;
 
double f(const int lv1, int sum)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / summ;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
         s = s + f(lv1 - 1, sum + i);
      return s;
   }
}
 
int main()
{
   double s;
   int i1, i2, i3, i4;
 
   s = 0;
   for (i1 = 1; i <= n; i++)
      for (i2 = 1; i2 <= n; i2++)
         for (i3 = 1; i3 <= n; i3++)
            s = s + 1.0 / (i1 + i2 + i3);
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << s << endl;
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0) << endl;
 
   return 0;
}
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
05.07.2012, 22:50     Для заданного целого числа n вычислить значение суммы #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
It fits...
Подходит бишь.
Рекурсивный алгоритм верный. Есть несколько ошибок в коде.

Исправленный вариант:
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "iostream"
#include "iomanip"
 
using namespace std;
 
const int n = 5;
 
double f(const int lv1, int sum)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / sum;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
{
         s = s + f(lv1 - 1, sum + i);
         //cout << i << ' ' << s << endl;
}
      return s;
   }
}
 
int main()
{
   double s;
   int i1, i2, i3, i4, i5;
 
   s = 0;
   for (i1 = 1; i1 <= n; i1++)
      for (i2 = 1; i2 <= n; i2++)
         for (i3 = 1; i3 <= n; i3++)
            for (i4 = 1; i4 <= n; i4++)
              for (i5 = 1; i5 <= n; i5++)
                s = s + 1.0 / (i1 + i2 + i3 + i4 + i5);
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << s << endl;
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0) << endl;
 
   return 0;
}
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
06.07.2012, 14:33     Для заданного целого числа n вычислить значение суммы #4
Подскажите пожалуйста как сделать для любого n вводимого пользователем с клавиатуры, этот код правильный????
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
int n;
double f(const int lv1, int sum)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / sum;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
{
         s = s + f(lv1 - 1, sum + i);
         //cout << i << ' ' << s << endl;
}
      return s;
   }
}
 
int main()
{
   double s;
   int i1, i2, i3, i4, i5,in;
  int n;
   s = 0;
cout<<"Enter n = ";
cin >>n;
   for (i1 = 1; i1 <= n; i1++)
      for (i2 = 1; i2 <= n; i2++)
         for (i3 = 1; i3 <= n; i3++)
            for (i4 = 1; i4 <= n; i4++)
              for (i5 = 1; i5 <= n; i5++)
              for (in = 1; in <= n; in++)
                s = s + 1.0 / (i1 + i2 + i3 + i4 + i5 + in);
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << s << endl;
 
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0) << endl;
 system("pause");
   return 0;
}
Заранее огромное спасибо.

Добавлено через 1 час 41 минуту
Подскажите пожалуйста что нужно сделать, чтобы для больших n = 100 и так далее считалось быстрее, а то у меня уже минут 20 висит????? Заранее огромное спасибо!!!!!
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
06.07.2012, 21:57     Для заданного целого числа n вычислить значение суммы #5
Для n, вводимого с клавиатуры.
C++
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
26
27
28
29
30
31
32
33
34
35
#include "iostream"
#include "iomanip"
 
using namespace std;
 
//const int n = 5;
 
double f(const int lv1, int sum, int n)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / sum;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
{
         s = s + f(lv1 - 1, sum + i, n);
}
      return s;
   }
}
 
int main()
{
   int n;
   cout << "Input n = ";
   cin >> n;
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0, n) << endl;
 
   return 0;
}
Насчёт ускорения процесса, тут задача оптимизации.
Пока ничего не приходит в голову, как сделать алгоритм эффективнее.

Добавлено через 13 минут
Зашьём счётчик операций для интереса.

C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "iostream"
#include "iomanip"
 
using namespace std;
 
//const int n = 5;
int GlobalCounter = 0;
 
double f(const int lv1, int sum, int n)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / sum;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
{
         cout << GlobalCounter++ << endl;
         s = s + f(lv1 - 1, sum + i, n);
 
}
      return s;
   }
}
 
int main()
{
   int n;
   cout << "Input n = ";
   cin >> n;
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0, n) << endl;
 
   return 0;
}
Ставим n = 10 и наслаждаемся.
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 656
07.07.2012, 01:11     Для заданного целого числа n вычислить значение суммы #6
Спасибо, предыдущий код быстро считал для n = 10, а вот для n = 90 считал около часа, а для n = 100 полностью зависал.
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
08.07.2012, 18:12  [ТС]     Для заданного целого числа n вычислить значение суммы #7
Цитата Сообщение от Thirteen Посмотреть сообщение
Для n, вводимого с клавиатуры.
C++
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
26
27
28
29
30
31
32
33
34
35
#include "iostream"
#include "iomanip"
 
using namespace std;
 
//const int n = 5;
 
double f(const int lv1, int sum, int n)
{
   double s;
   int i;
 
   if (lv1 == 0)
      return 1.0 / sum;
   else
   {
      s = 0;
      for (i=1; i<=n; i++)
{
         s = s + f(lv1 - 1, sum + i, n);
}
      return s;
   }
}
 
int main()
{
   int n;
   cout << "Input n = ";
   cin >> n;
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0, n) << endl;
 
   return 0;
}
Объясните пожалуйста, как это работает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2012, 09:52     Для заданного целого числа n вычислить значение суммы
Еще ссылки по теме:

C++ Функции. побитовые операции. Написать функцию, которая для заданного целого числа Х вычисляет количество единичных битов в этом числе
C++ Вычислить приближенно значение бесконечной суммы (справа от каждой суммы дается ее точное значение, с которым можно сравнить полученный ответ)
Вычислить факториал заданного целого числа C++
Вычислить значение суммы квадратов от 1 до введеного числа C++
Написать рекурсивную функцию для вычисления натуральной степени заданного целого числа C++

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

Или воспользуйтесь поиском по форуму:
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
09.07.2012, 09:52     Для заданного целого числа n вычислить значение суммы #8
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "iostream"
#include "iomanip"
 
using namespace std;
 
//const int n = 5;
 
double f(const int lv1, int sum, int n) //Рекурсивная функция для вычисления суммы
//Принимает аргументы: lv1 - уровень цикла, sum - эту сумму мы передаём рекурсивно
//n - сколько раз суммировать.
{
   double s; //Посчитанная сумма
   int i; //Просто счётчик
 
   if (lv1 == 0)           //Если уровень цикла нулевой,
      return 1.0 / sum; //то выводим 1/сумму.
   else
   {
      s = 0;
      for (i=1; i<=n; i++) //Цикл, как и полагается от 0 до n
{
         s = s + f(lv1 - 1, sum + i, n); //Рекурсивный вызов с уменьшением уровня цикла и
                                                 //увеличиваем сумму на итерацию.
//Подробнее, что происходит:
//Допустим n = 3. Мы сначала вызвали f(3,0,3)
//Программа заходит в f, смотрит, уровень цикла не ноль (lv1!=0), значит надо войти в цикл
//и вызвать рекурсивно функцию, уменьшив при этом уровень на 1 и увеличив sum на итерацию
//то есть происходит вызов f(2,1,3)
//Дальше опять уровень не ноль, вызов f(1,2,3)
//Наконец происходит f(0,3,3) там уже уровень цикла 0, потому функция считает 1/sum
//и возвращает управление. И тут начинается самое интересное, функция возвращает управление
//туда, откуда произошёл вызов рекурсии. То есть в цикл. И выполняется рекурсивный вызов уже для
//i = 2. И так далее всё это происходит пока все циклы не кончатся. Тогда функция вернёт уже s,
//в которой хранится результат всех сложений во всех циклах.
}
      return s; //Вот прямо здесь и вернёт
   }
}
 
int main() //Это просто тест для f.
{
   int n; //Будем вводить с клавиатуры
   cout << "Input n = ";
   cin >> n;
   cout << setiosflags(ios::fixed | ios::showpoint) << setprecision(8)
          << f(n, 0, n) << endl; //Выведем сумму.
 
   return 0;
}
Что-то непонятно?
Yandex
Объявления
09.07.2012, 09:52     Для заданного целого числа n вычислить значение суммы
Ответ Создать тему
Опции темы

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