Сумма в цикле не отображает фактический результат? - PullRequest
0 голосов
/ 19 сентября 2019

Предполагается, что я суммирую квадраты всех натуральных чисел, пока не достигнет некоторого значения, но результат станет больше, чем должен.Когда я задаю 3 в качестве входных данных, результат становится 3 * 10⁹ или около того, не могли бы вы сказать, если я пропустил ошибку с типами данных или операциями?

Кстати, когда использование функций становится более эффективным, чем написание чего-либов основном коде?У меня довольно много сомнений относительно того, когда я должен или не должен их использовать.

Благодаря тому, кто бы мог это прочитать.

#include <iostream>
using namespace std;

int main(){
    int input, sum;
    cin >> input;
    for(int i = 1; i <= input; i++){
        sum += i*i;
    }
    cout << sum << endl;
}

Ответы [ 4 ]

3 голосов
/ 19 сентября 2019

Вы должны инициализировать переменную sum с помощью 0, после чего программа будет успешно запущена.Когда вы используете sum без инициализации, поведение вашей программы будет undefined .

Также вы можете использовать приведенную ниже формулу вместо цикла for:

sum = n * (n + 1) * (2 * n + 1) / 6

2 голосов
/ 19 сентября 2019

Вы никогда не инициализируете sum, поэтому нет гарантии, что значение начинается с 0. На самом деле, его начальное значение по существу не определено.Вы должны просто добавить строку sum = 0; перед циклом for.

#include <iostream>
using namespace std;

int main(){
    int input, sum;
    sum = 0;
    cin >> input;
    for(int i = 1; i <= input; i++){
        sum += i*i;
    }
    cout << sum << endl;
}

"Кстати, когда использование функций становится более эффективным, чем запись чего-либо в основном коде"

Это не такОбязательно более эффективный, но для больших проектов легче читать код, когда общие функциональные возможности сгруппированы в многократно используемые функции.Как правило, если вы пишете один и тот же код / ​​алгоритм более одного раза, вы должны написать функцию для этого кода / алгоритма.

ПРИМЕЧАНИЕ - Как указывалось другими, существует формула для расчета суммы квадратов без цикла.

sum = n * (n + 1) * (2 * n + 1) / 6

Это так называемое решение порядка 1 или O(1), поскольку для достижения желаемых результатов можно выполнить одну атомарную операцию.С другой стороны, решение цикла считается порядка n , или O(n), так как n итерации цикла должны быть выполнены для достижения результатов процедуры.Решение O(1) считается оптимальным.Если вы используете большие значения в качестве входных данных, вы поймете, почему.Однако, если вы новичок в программировании, ваши учителя не будут ожидать, что вы узнаете много об анализе алгоритмов, и оригинальное решение, приведенное выше, должно подойти.

1 голос
/ 19 сентября 2019

Существует два подхода к решению вашей проблемы.

Первый - поместить объявление переменной sum перед main.Например,

#include <iostream>
using namespace std;

int sum;

int main(){
    int input;
    cin >> input;
    for(int i = 1; i <= input; i++){
        sum += i*i;
    }
    cout << sum << endl;
}

В этом случае переменная будет иметь статическую длительность хранения и будет инициализирована компилятором с 0.

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

#include <iostream>
using namespace std;

int main(){
    int input, sum = 0;
    cin >> input;
    for(int i = 1; i <= input; i++){
        sum += i*i;
    }
    cout << sum << endl;
}

Обратите внимание, что лучше объявить переменную с типом long long int, потому что сумма квадратов может быть слишком большой и не будет вписываться в объект типа int.Например

#include <iostream>
using namespace std;

int main(){
    int input;
    long long int sum =0;
    cin >> input;
    for(int i = 1; i <= input; i++){
        sum += ( long long int )i*i;
    }
    cout << sum << endl;
}
0 голосов
/ 19 сентября 2019

Вы не инициализируете sum.Поэтому, когда вы делаете sum += i * i, вы добавляете числа к значению корзины.
По этой причине вы получаете неправильные результаты.
Чтобы это исправить, просто замените int input, sum; на int input, sum(0);.

...