循环求和不显示实际结果?
Sum in loop not displaying actual result?
我应该对所有自然数的平方求和,直到达到某个输入,但结果变得比应有的大。当我设置 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;
}
您从不初始化 sum
,因此无法保证该值从 0 开始。事实上,它的初始值本质上是未定义的。您应该简单地在 for 循环之前添加行 sum = 0;
。
#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;
}
"BTW, when does using functions become more efficient than writing whatever in the main code"
它不一定更高效,但对于较大的项目,将常用功能分组为可重用函数时,代码更容易阅读。作为一般经验法则,如果您多次编写相同的 code/algorithm,则应该为该 code/algorithm 编写一个函数。
注意 - 正如其他人所指出的那样,恰好有一个公式可以在没有循环的情况下计算平方和。
sum = n * (n + 1) * (2 * n + 1) / 6
这就是所谓的 1 阶 或 O(1)
解决方案,因为可以执行单个原子操作来实现您正在寻找的结果.另一方面,循环解决方案被认为是 n 的 阶,或 O(n)
,因为必须执行循环的 n
次迭代才能获得结果常规。 O(1)
解决方案被认为是最优的。如果您使用大值作为输入,那么您就会明白为什么。但是,如果您是编程新手,那么您的老师不会期望您对算法分析了解太多,上面的原始解决方案应该没问题。
您没有初始化 sum
。因此,每当您执行 sum += i * i
时,您就是在将数字添加到垃圾值中。
这就是您得到错误结果的原因。
要解决此问题,只需将 int input, sum;
替换为 int input, sum(0);
。
你应该用0
初始化变量sum
然后程序就会运行成功。当你使用 sum
而不初始化它时,你的程序的行为是 undefined.
您也可以使用以下公式代替 for 循环:
sum = n * (n + 1) * (2 * n + 1) / 6
有两种方法可以解决您的问题。
第一个是将变量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;
}
我应该对所有自然数的平方求和,直到达到某个输入,但结果变得比应有的大。当我设置 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;
}
您从不初始化 sum
,因此无法保证该值从 0 开始。事实上,它的初始值本质上是未定义的。您应该简单地在 for 循环之前添加行 sum = 0;
。
#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;
}
"BTW, when does using functions become more efficient than writing whatever in the main code"
它不一定更高效,但对于较大的项目,将常用功能分组为可重用函数时,代码更容易阅读。作为一般经验法则,如果您多次编写相同的 code/algorithm,则应该为该 code/algorithm 编写一个函数。
注意 - 正如其他人所指出的那样,恰好有一个公式可以在没有循环的情况下计算平方和。
sum = n * (n + 1) * (2 * n + 1) / 6
这就是所谓的 1 阶 或 O(1)
解决方案,因为可以执行单个原子操作来实现您正在寻找的结果.另一方面,循环解决方案被认为是 n 的 阶,或 O(n)
,因为必须执行循环的 n
次迭代才能获得结果常规。 O(1)
解决方案被认为是最优的。如果您使用大值作为输入,那么您就会明白为什么。但是,如果您是编程新手,那么您的老师不会期望您对算法分析了解太多,上面的原始解决方案应该没问题。
您没有初始化 sum
。因此,每当您执行 sum += i * i
时,您就是在将数字添加到垃圾值中。
这就是您得到错误结果的原因。
要解决此问题,只需将 int input, sum;
替换为 int input, sum(0);
。
你应该用0
初始化变量sum
然后程序就会运行成功。当你使用 sum
而不初始化它时,你的程序的行为是 undefined.
您也可以使用以下公式代替 for 循环:
sum = n * (n + 1) * (2 * n + 1) / 6
有两种方法可以解决您的问题。
第一个是将变量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;
}