0 / 0 / 0
Регистрация: 09.12.2021
Сообщений: 8
1

Вычислить сумму 1! + 2! + 3! + … + n! (n<15)

09.12.2021, 23:07. Показов 2464. Ответов 13

Студворк — интернет-сервис помощи студентам
Создать программу вычисления суммы 1! + 2! + 3! + … + n! (n<15). Используя рекурсивную функцию и указатели.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2021, 23:07
Ответы с готовыми решениями:

Ввести с клавиатуры 3 числа А, В, С. Вычислить сумму А и В, затем эту сумму умножить на С
Задание №1 Тема: Линейные алгоритмы. Составить блок-схему. Ввести с клавиатуры 3 числа А,...

Вычислить сумму и найти число слагаемых, которые вошли в эту сумму
Вычислить сумму и найти число слагаемых, которые вошли в эту сумму. Процессы вычисление требуется...

Вычислить сдельную зарплату работника, а также сумму налога и сумму на руки.
Вычислить сдельную зарплату работника, а также сумму налога и сумму на руки. Значения рассчитать по...

Вычислить сумму, предусмотреть использование функции, которая вычисляет сумму
Здравствуйте. Помогите найти ошибку, задание: Составить программу для вычисления \omega...

Вычислить сумму и найти число слагаемых, которые вошли в сумму
Вычислить сумму и найти число слагаемых, которые вошли в сумму.Процесс вычислений требуется...

13
Модератор
2547 / 1646 / 896
Регистрация: 16.10.2013
Сообщений: 4,874
Записей в блоге: 13
10.12.2021, 07:02 2
Лучший ответ Сообщение было отмечено SmallEvil как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
std::size_t foo(std::size_t *n, std::size_t i = 1, std::size_t s = 1) {
    s *= i;
    if (i < *n) {
        return s + foo(n, i+1, s);
    }
    return s;
}
 
int main() {
    std::size_t n = 9;
    std::cout << foo(&n);
    return 0;
}
3
Модератор
Эксперт CЭксперт С++
4647 / 2666 / 1436
Регистрация: 14.12.2018
Сообщений: 4,961
Записей в блоге: 1
10.12.2021, 07:04 3
Romanchik1,

https://www.cyberforum.ru/cgi-bin/latex.cgi?S_n=\left\{\begin{matrix}<br />
1 & if & n=1\\ <br />
3 & if & n=2\\ <br />
(n+1)S_{n-1}-nS_{n-2} & if & n\geq 3<br />
\end{matrix}\right.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
int S(int n)
{
    if (n == 1) return 1;
    else if (n == 2) return 3;
    else return (n + 1) * S(n - 1) - n * S(n - 2);
}
int main()
{
    int n;
    do
    {
        std::cout << "n = ";
        std::cin >> n;
    } while (n < 1 || n >= 15);
    std::cout << "S(" << n << ") = " << S(n);
    return 0;
}
2
0 / 0 / 0
Регистрация: 09.12.2021
Сообщений: 8
10.12.2021, 21:59  [ТС] 4
Извините. Всё отлично, но программа считает только 12 факториалов,можно ли это исправить? Я так понял это предел программы
0
2341 / 1869 / 606
Регистрация: 29.06.2020
Сообщений: 7,057
10.12.2021, 23:19 5
Цитата Сообщение от Romanchik1 Посмотреть сообщение
Всё отлично, но программа считает только 12 факториалов,можно ли это исправить? Я так понял это предел программы
это предел переменной
C++
1
unsigned long long S(unsigned long long n)
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
11.12.2021, 01:34 6
А зачем тут указатели?

Решение с рекурсией, но без указателей.
Может и влезет и для значения 15.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <algorithm>
#include <cstdint>
#include <stdexcept>
#include <iostream>
#include <string>
 
namespace{
using uint128_t = __uint128_t;
 
uint128_t sum_facts_tail(
    const uint128_t old_sum,
    const uint128_t prev_factorial,
    const uint16_t current_multiplier,
    const uint16_t max_multiplier
) {
    if (current_multiplier > max_multiplier){
        return old_sum;
    }
    else{
        const uint128_t current_factorial = prev_factorial * current_multiplier;
        [[clang::musttail]]
        return sum_facts_tail(
            old_sum + current_factorial,
            current_factorial,
            current_multiplier + 1,
            max_multiplier
        );
    }
}
 
uint128_t sum_facts_up_to(const uint16_t max_multiplier){
    if (max_multiplier > 15){
        throw std::logic_error{"Too big max_multiplier"};
    }
    return sum_facts_tail(0, 1, 1, max_multiplier);
}
 
std::string big_int_to_string(uint128_t v){
    auto r = std::string{};
    while (v > 0){
        constexpr uint128_t divider = 10;
        const int digit_val = v % divider;
        const char digit = digit_val + '0';
        v /= divider;
        r += digit;
    }
    std::reverse(r.begin(), r.end());
    return r;
}
 
} // namespace
 
int main(){
    std::cout << "Input max nums up to sum: ";
    const uint16_t max_val = [](){
        uint16_t v;
        std::cin >> v;
        return v;
    }();
 
    const auto result = sum_facts_up_to(max_val);
    std::cout 
        << std::endl
        << "Got sum: "
        << big_int_to_string(result)
        << std::endl;
}
0
0 / 0 / 0
Регистрация: 09.12.2021
Сообщений: 8
12.12.2021, 01:23  [ТС] 7
не меняется ничего,считает только до 12 факториалов
0
2341 / 1869 / 606
Регистрация: 29.06.2020
Сообщений: 7,057
12.12.2021, 03:14 8
Romanchik1, 8-байтного целого без знакового хватает для 14!
0
Модератор
Эксперт CЭксперт С++
4647 / 2666 / 1436
Регистрация: 14.12.2018
Сообщений: 4,961
Записей в блоге: 1
12.12.2021, 07:13 9
Цитата Сообщение от Romanchik1 Посмотреть сообщение
не меняется ничего,считает только до 12 факториалов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
long long S(int n)
{
    if (n == 1) return 1;
    else if (n == 2) return 3;
    else return (n + 1) * S(n - 1) - n * S(n - 2);
}
int main()
{
    int n;
    do
    {
        std::cout << "n = ";
        std::cin >> n;
    } while (n < 1 || n >= 15);
    std::cout << "S(" << n << ") = " << S(n);
    return 0;
}
Код
n = 14
S(14) = 93928268313
0
Модератор
Эксперт CЭксперт С++
4647 / 2666 / 1436
Регистрация: 14.12.2018
Сообщений: 4,961
Записей в блоге: 1
12.12.2021, 13:06 10
Цитата Сообщение от Yetty Посмотреть сообщение
Вы на самом деле не понимаете что факториал (за исключением единицы) чётное число ?
Что неправильно ? Что у вас получилось ?
0
Модератор
Эксперт CЭксперт С++
4647 / 2666 / 1436
Регистрация: 14.12.2018
Сообщений: 4,961
Записей в блоге: 1
12.12.2021, 13:19 11
Цитата Сообщение от Yetty Посмотреть сообщение
n = 13
S(13) = 6749977113
должно получаться 1145659113
Откуда 1145659113 ??? Вы уверены, что 1!+2!+...+13!=1145659113 ?????

Добавлено через 3 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
del
Цитата Сообщение от Yetty Посмотреть сообщение
del
Что-то вы хотите делать здесь ? Почему вы уже удалили все своих ?
0
7427 / 5021 / 2891
Регистрация: 18.12.2017
Сообщений: 15,694
12.12.2021, 13:32 12
Volga_, я ошибся. подсчитал ещё раз - правильно вычисляет программа. прошу прощения, невнимательно пересчитал

Добавлено через 5 минут
просто я раньше смотрел Ваш первый код - он считал неправильно для n>12. и не заметил что во втором коде тип long long

Добавлено через 2 минуты
при выполнении условия
Цитата Сообщение от Romanchik1 Посмотреть сообщение
Используя рекурсивную функцию и указатели.
код подходил бы под условие задачи
0
Модератор
Эксперт CЭксперт С++
4647 / 2666 / 1436
Регистрация: 14.12.2018
Сообщений: 4,961
Записей в блоге: 1
12.12.2021, 14:13 13
Romanchik1, вот с указателем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
long long S(int* n)
{
    if (*n == 1) return 1;
    else if (*n == 2) return 3;
    else
    {
        static int n_1 = *n - 1;
        static int n_2 = *n - 2;
        return (*n + 1) * S(&n_1) - *n * S(&n_2);
    }
}
int main()
{
    int n;
    do
    {
        std::cout << "n = ";
        std::cin >> n;
    } while (n < 1 || n >= 15);
    std::cout << "S(" << n << ") = " << S(&n);
    return 0;
}
Нет, это неправильно ! Подумаю еще....
0
0 / 0 / 0
Регистрация: 09.12.2021
Сообщений: 8
12.12.2021, 20:05  [ТС] 14
Немного переделал и теперь программа считает до 14 факториалов

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
#include <iostream>
using namespace std;
long long foo(long long* n, long long i = 1, long long s = 1)
{
    s *= i;
    if (i < *n)
    {
        return s + foo(n, i + 1, s);
    }
    return s;
}
 
int main()
{
 
    setlocale(LC_ALL, "ru");
    cout << "Вычислить сумму 1! + 2! + 3! + … + n!(n>15)." << endl;
    int k;
    cout << "n=";
    cin >> k;
    long long n = k;
    cout << foo(&n);
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2021, 20:05
Помогаю со студенческими работами здесь

Вычислить сумму и найти число слагаемых, которые вошли в сумму
ычислить сумму и найти число слагаемых, которые вошли в сумму.Процесс вычисления требуется...

Вычислить сумму и найти число слагаемых, которые вошли в сумму
Вычислить сумму и найти число слагаемых, которые вошли в сумму. Процесс вычислений требуется...

Вычислить сумму и найти число слагаемых, которые вошли в сумму
Вычислить сумму и найти число слагаемых, которые вошли в сумму. Процесс вычислений требуется...

Вычислить сумму положительных и сумму отрицательных элементов вещественного массива М[55]
Реализовать программу с помощью функций, С++

Вычислить отдельно сумму четных и сумму нечетных членов последовательности
Добрый день! Только начал изучать этот язык и пытаюсь решить две задачи. Увы, с одной всё вообще...

Вычислить сумму четных и сумму нечетных чисел натурального ряда от 1 до N
Вычислить сумму четных и сумму нечетных чисел натурального ряда от 1 до N. Не могу найти где...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru