Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

05.07.2012, 14:15. Просмотров 1401. Ответов 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)
0
Изображения
 
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2012, 14:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Для заданного целого числа n вычислить значение суммы (C++):

Для заданного целого числа n вычислить значение суммы - C++
Для заданного целого числа n вычислить значение суммы:\sum_{{i}_{1}}^{n}\sum_{{i}_{2}}^{n}...\sum_{{i}_{n}}^{n}\frac{1}{{i}_{1}+...{i}_{n}}

Для заданного целого числа n вычислить - C++
Для заданного целого числа n вычислить \sum_{i=1}^{n}\frac{100}{{i}^{2}}+3*i Помогите с програмой пожалуй, зарание спасибо

Вычислить факториал заданного целого числа - C++
Составить блок схему алгоритма и программу согласно условию задачи. Вычислить факториал заданного целого числа. Факториал числа N...

Цикл: Вычислить значение для заданного пользователем числа X по формуле: (((x + a^2) + a^2)... + a^2) - C++
Даны действительные числа x, a, натуральное n. Вычислить: n - скобок

Вычислить квадратный корень из заданного целого числа, используя только побитовые операции - C++
Существует простой способ вычисления квадратного корня: квадратный корень из целого числа равен количеству последовательных целых чисел...

Вычислить значение целого числа - C++
Приветствую. Если напишу, что нужна помощь в решении задачи - сурово вас обману. Помощь не нужна - нужно решение. Или хотя бы пояснения на...

7
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
05.07.2012, 17:21  [ТС] #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;
}
0
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
05.07.2012, 22:50 #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;
}
3
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
06.07.2012, 14:33 #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 висит????? Заранее огромное спасибо!!!!!
0
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
06.07.2012, 21:57 #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 и наслаждаемся.
2
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
07.07.2012, 01:11 #6
Спасибо, предыдущий код быстро считал для n = 10, а вот для n = 90 считал около часа, а для n = 100 полностью зависал.
0
Анастасия Ан
0 / 0 / 0
Регистрация: 13.03.2012
Сообщений: 14
08.07.2012, 18:12  [ТС] #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;
}
Объясните пожалуйста, как это работает?
0
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
09.07.2012, 09:52 #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;
}
Что-то непонятно?
1
09.07.2012, 09:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2012, 09:52
Привет! Вот еще темы с ответами:

Для заданного четного числа вычислить сумму, для нечетного произведение чисел от 1 до заданного - C++
c++ дано число вводится с клавиатуры, если оно четное, то ввести сумму с 1 до n. Если нечетное — произведение от 1 до n. вывести на экран

Вывести количество десятичных цифр, необходимых для представления заданного целого числа - C++
Ввести целое N. Вывести количество десятичных цифр, необходимых для представления этого числа. Добавлено через 23 часа 13 минут ...

Написать рекурсивную функцию для вычисления натуральной степени заданного целого числа - C++
Рекурсия. Помогите исправить программу: Напишите рекурсивную функцию для вычисления натуральной степени заданного целого числа. ...

Программа вычисления суммы 1 + 1/2 + 1/3 + … + 1/n для заданного числа n - C++
Доброго времени суток! Помогите пожалуйста разобраться вот с такой проблемой. Разбираюсь с простенькими заданиями, на очереди вот это:...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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