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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
24.06.2014, 14:51     Вычислить сумму всех целых чисел, лежащих между двумя целыми числами, выбранными пользователем #1
Прата, кто ж ещё. Решал сидел простенькую вроде задачку, а весь мозг себе взорвал. Почти решил, но где-то закралась ошибка. Что не так - не могу понять, мозги уже кипят:
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 минут
А вот интересно, как посчитать всю сумму вектора, кроме его самого первого элемента?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2014, 14:51     Вычислить сумму всех целых чисел, лежащих между двумя целыми числами, выбранными пользователем
Посмотрите здесь:

В одномерном массиве целых чисел содержится два нулевых значения. Подсчитать сумму чисел, заключённых между двумя нулями. C++
Вычислить сумму квадратов всех целых чисел попадающих в интервал(lnx,e^x) x>1. C++
Вычислить и отобразить сумму всех целых чисел C++
C++ Вывод всех чисел, находящихся между двумя заданными числами
C++ Вычислить сумму всех чисел, лежащих между двумя целыми
C++ Найти сумму между двумя введенными числами, включая эти числа
Определить сумму нечетных чисел числовой последовательности из n целых чисел, вводимых пользователем C++
C++ Вычислить сумму квадратов всех целых чисел, меньших заданного числа a

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
26.06.2014, 15:06     Вычислить сумму всех целых чисел, лежащих между двумя целыми числами, выбранными пользователем #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
сумма чисел от 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;
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
26.06.2014, 15:54  [ТС]     Вычислить сумму всех целых чисел, лежащих между двумя целыми числами, выбранными пользователем #3
Цитата Сообщение от 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;
}
Премного благодарен!
Yandex
Объявления
26.06.2014, 15:54     Вычислить сумму всех целых чисел, лежащих между двумя целыми числами, выбранными пользователем
Ответ Создать тему
Опции темы

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