С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/48: Рейтинг темы: голосов - 48, средняя оценка - 4.67
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20

Вычислить сумму всех целых чисел, лежащих между двумя целыми числами, выбранными пользователем

24.06.2014, 14:51. Показов 9512. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прата, кто ж ещё. Решал сидел простенькую вроде задачку, а весь мозг себе взорвал. Почти решил, но где-то закралась ошибка. Что не так - не могу понять, мозги уже кипят:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//  sp_Ch5P255_Exercise01
/// Занятия по книге Стивена Праты "Язык программирования С++" (2012, 6-е издание).
/// Упражнения по программированию. Глава 5, страница 255, упражнение 1.
/*
Напишите программу, запрашивающую у пользователя ввод двух целых чисел.
Затем программа должна вычислить и выдать сумму всех целых чисел, лежащих
между этими двумя целыми. Предполагается, что меньшее значение вводится
первым. Например, если пользователь ввел 2 и 9, программа должна сообщить,
что сумма всех целых чисел от 2 до 9 равна 44.
*/
 
#include <iostream>
#include <vector>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int varX;   // первое число
    int varY;   // второе число
 
    tryagain:   // метка для перехода на эту строку
    cout << "Введите два целых положительных числа, так, чтобы "
            "второе число было больше первого." << endl;
    cout << "Ваше первое число: ";
    cin >> varX;    // пользователь вводит первое число и оно
                    // сохраняется в переменной varX
    cout << "Ваше второе число: ";
    cin >> varY;    // пользователь вводит второе число и оно
                    // сохраняется в переменной varY
 
//==== Блок проверки правильности введённых пользователем значений ====
    if ((varX <= 0) || (varY <= varX))
    {
        cout << "Вы ошиблись в выборе чисел. Попробуйте ещё раз." << endl;
        goto tryagain; // возвращаемся к метке tryagain
    }
//====================================================================
 
// Допустим, пользователь ввёл корректные значения, например 2 и 6. Тогда:
    int n = (varY-varX)+1;      // В переменную n записывается результат вычисления
                                // выражения (varY-varX)+1, то есть в нашем случае 5.
 
    vector<int>myVector(n);     // Создадим контейнер класса вектор из n-ого
                                // количества элементов типа int и обзовём его
                                // myVector. Количество элементов должно вмещать все
                                // целые числа начиная с varX до varY включительно.
                                // В нашем случае нам понадобится пять
                                // элементов для чисел 2, 3, 4, 5, 6.
    vector<int>::iterator myIterator; // создаём итератор
 
    int a = varX; // сохраняем значение переменной varX в переменную a,
            // потому что потом varX будет изменено, а её значение ещё понадобится
            // для вывода в самом конце (интересно, можно это как-то элегантнее сделать?)
    int b = varY; // то же самое для переменной varY
    --varY; // Декрементируем varY. Теперь varY равна 5.
 
    while (varX <= n+1)
    {
    // Если varX не больше n+1, то
        myVector[varY-1] = varX; // записать в элемент вектора (varY-1) значение varX
        ++varX;
        --varY;
    }
 
 
//======= Первый виток цикла.
// Цикл проверяет условие (varX <= n+1). 2 <= 6. Истина.
// В элемент вектора myVector[4] записывается 2.
// Инкремент varX и декремент varY
// Таким образом varX становится равен 3, а varY равен 5.
// Первый проход завершён.
 
//======= Второй виток цикла.
// Цикл проверяет условие (varX <= n+1). 3 <= 6. Истина.
// В элемент вектора myVector[3] записывается 3.
// Инкремент varX и декремент varY
// Таким образом varX становится равен 4, и varY равен 4.
// Второй проход завершён.
 
//======= Третий виток цикла.
// Цикл проверяет условие (varX <= n+1). 4 <= 6. Истина.
// В элемент вектора myVector[2] записывается 4.
// Инкремент varX и декремент varY
// Таким образом varX становится равен 5, а varY равен 3.
// Третий проход завершён.
 
//======= Четвёртый виток цикла.
// Цикл проверяет условие (varX <= n+1). 5 <= 6. Истина.
// В элемент вектора myVector[1] записывается 5.
// Инкремент varX и декремент varY
// Таким образом varX становится равен 6, а varY равен 2.
// Четвёртый проход завершён.
 
//======= Пятый виток цикла.
// Цикл проверяет условие (varX <= n+1). 6 <= 6. Истина.
// В элемент вектора myVector[0] записывается 6.
// Инкремент varX и декремент varY
// Таким образом varX становится равен 7, а varY равен 1.
// Пятый проход завершён.
 
//======= Шестой виток цикла.
// Цикл проверяет условие (varX <= n+1). 7 <= 6. Ложь.
// Выход из цикла.
//================================================
 
 
//======= Вычисляем сумму всех элементов вектора:
    for (int i=0; i < 10; i++) {
        myVector.push_back(i);
    }
    int total = 0;
    myIterator = myVector.begin();
    while (myIterator != myVector.end())
    {
      total += *myIterator;
      ++myIterator;
    }
    cout << "Cумма всех целых чисел от " << a
         << " до " << b << " равна " << total << endl;
 
    return 0;
}
Через пять минут после того как решил (ну, почти решил), на форуме нашёл простое решение без извращений:

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
#include <iostream>
#include <windows.h>
using namespace std;
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int Num_1, Num_2, Count;
 
    cout << "Введите первое(меньшее) число: "; cin >> Num_1;
    cout << "Введите второе(большее) число: "; cin >> Num_2;
    Count = Num_2 - Num_1;
 
    int np, summ = 0;
    for (np = 0 ; np <= Count; np++)
    {
        summ += Num_1 + np;
    }
 
    cout << "Cумма всех целых чисел от " << Num_1
         << " до " << Num_2 << " равна " << summ << endl;
    system("pause");
    return 0;
}
Самое обидное, что пока я два дня мучился, пытаясь такую смешную задачку решить.
Так что мне теперь охота свой вариант до рабочего состояния домучать.
Может кто подскажет, где я там напортачил?

Добавлено через 15 минут
Всё, нашёл ошибку. Блин, глупость какая, всё-таки
Надо было в условии цикла i < n сделать (а я как из вики скопировал i < 10, так у меня и осталось).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//======= Вычисляем сумму всех элементов вектора:
    for (int i=0; i < n; i++) {
        myVector.push_back(i);
    }
    int total = 0;
    myIterator = myVector.begin();
    while (myIterator != myVector.end())
    {
      total += *myIterator;
      ++myIterator;
    }
    cout << "Cумма всех целых чисел от " << a
         << " до " << b << " равна " << total << endl;
 
    return 0;
}
Добавлено через 2 часа 13 минут
А вот интересно, как посчитать всю сумму вектора, кроме его самого первого элемента?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2014, 14:51
Ответы с готовыми решениями:

Вычислить сумму всех чисел, лежащих между двумя целыми
Нужно написать программу, которая запрашивает ввод двух целых чисел(сначала меньшее, потом большее). Затем программа должна вычислить и...

Сумма всех целых чисел, лежащих между этими двумя числами
Напишите программу, запрашивающую у пользователя ввод двух целых чисел. Затем программа должна вычислить и выдать сумму всех целых чисел,...

Вычислить и вывести сумму всех целых чисел, лежащих между введенными
Очень надо ребята, не сдам прогу, попрут с универа! C++ Напишите программу, которая запрашивает у пользователя от двух целых чисел....

3
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
26.06.2014, 15:06
сумма чисел от A до B равна == (сумма чисел от 1 до B) - (сумма чисел от 1 до A - 1);

а сумма натуральных чисел от 1 до X == X * (X + 1) / 2;

поэтому

C++ (Qt)
1
2
3
4
5
6
int a, b;
cin >> a >> b;
a--;
long long sB = b * 1LL * (b + 1) / 2LL;
long long sA = a * 1LL * (a + 1) / 2LL;
cout << sB - sA << endl;
3
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.06.2014, 15:54  [ТС]
Цитата Сообщение от SlavaSSU Посмотреть сообщение
сумма чисел от A до B равна == (сумма чисел от 1 до B) - (сумма чисел от 1 до A - 1);
а сумма натуральных чисел от 1 до X == X * (X + 1) / 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
#include <iostream>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int a, b;
 
    cout << "Введите первое(меньшее) число: ";
    cin >> a;
 
    cout << "Введите второе(большее) число: ";
    cin >> b;
 
    int t = a-1;
    int sB = b * (b + 1) / 2;
    int sA = t * (t + 1) / 2;
 
    cout << "Cумма всех целых чисел от " << a
    << " до " << b << " равна " << sB - sA << endl;
 
    return 0;
}
Премного благодарен!
0
8 / 7 / 1
Регистрация: 19.12.2020
Сообщений: 51
29.01.2021, 10:46
Всем привет. Все правильно, но задача относится к главе, в которой рассматриваются циклы, подразумевается, что и решаться она будет при помощи циклов для закрепления материала,в любом случае не хитрое решение, работает как с положительными так и с отрицательными числами :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
int main()
{
    using namespace std;
    int initial_value, end_value;
    cout << " Enter the initial value : ";
    cin >> initial_value;
    cout << " Enetr the end value : ";
    cin >> end_value;
    int summa = 0;
    for (initial_value; initial_value <= end_value; initial_value++)
    {
        summa += initial_value;
    }
    cout << " Summa = " <<summa;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2021, 10:46
Помогаю со студенческими работами здесь

Вычислить сумму квадратов всех целых чисел, расположенных между n и m включительно
Для заданных целых чисел n и m вычислить сумму квадратов всех целых чисел, расположенных между n и m включительно. Ответ вывести по модулю...

Вывод всех чисел, находящихся между двумя заданными числами
Задание: напишите программу, которая запрашивает у пользователя два числа и выводит на стандартное устройство ввода все числа, которые...

В одномерном массиве целых чисел содержится два нулевых значения. Подсчитать сумму чисел, заключённых между двумя нулями.
В одномерном массиве целых чисел содержится два нулевых значения. Подсчитать сумму чисел, заключённых между двумя нулями. Если можно с...

Требуется посчитать сумму целых чисел, расположенных между числами 1 и N включительно
Добрый день! Данная задача задавалась на этом и на других форумах не раз, но в каждый раз предлагали какое-то сложное решение по формуле...

Найти сумму всех целых чисел, лежащих между 1 и N включительно.
Найти сумму всех целых чисел, лежащих между 1 и N включительно. Исходные данные: В единственной строке расположено число N, по...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru