到目前为止,这是我的代码,但答案是不正确的。我做错了什么?我应该找出平方和和前100个自然数和的平方之间的差异。
#include<iostream>
using namespace std;
int main(){
int sumOfSquare = 0;
for(int i=1; i<=100; i++){
i = i*i;
sumOfSquare += i;
};
int squareOfSum = 0;
for(int i; i<=100; i++){
squareOfSum +=i;
};
squareOfSum = squareOfSum * squareOfSum;
int difference = squareOfSum - sumOfSquare;
cout<<difference;
}
发布于 2019-10-27 07:11:16
正如Evg所建议的,如果不修改循环将运行的次数,就不能修改循环/索引变量。
尝试为“临时”(每次迭代)和添加另一个变量,然后使用该变量。如下所示:
#include<iostream>
using namespace std;
int main(){
int sumOfSquare = 0;
for(int i=1, j; i<=100; i++){
j = i*i;
sumOfSquare += j;
};
int squareOfSum = 0;
for(int i = 1; i<=100; i++){
squareOfSum +=i;
};
squareOfSum = squareOfSum * squareOfSum;
int difference = squareOfSum - sumOfSquare;
cout<<difference;
}
编辑:对于Evg,您没有在第二个循环中初始化i
,因此它的初始值是未定义的,并且它循环了未定义的次数。将int i = 1
添加到第二个循环中(已在我的代码中修复)。
发布于 2019-10-27 08:30:39
你的两个循环都有问题。第一个是i = i * i
,它导致循环不能按照你想要的方式运行,第二个没有初始化就使用了i
。即使你修复了这些,你的代码也是非常低效的。你可以通过使用一些数学方法来使它的效率O(1)
:
#include<iostream>
int main() {
constexpr int n = 100;
int sumOfSquare = n * (n + 1) * (2 * n + 1) / 6; // sum of square of first n numbers
int squareOfSum = n * (1 + n) / 2; // sum of first n numbers
squareOfSum = squareOfSum * squareOfSum;
int difference = squareOfSum - sumOfSquare;
std::cout << difference << '\n';
}
发布于 2019-10-27 07:23:29
首先,当你在第一个循环中计算平方和时,你是在计算i的平方,但是对于for循环的下一次迭代,数值会不同,假设我的值是3,所以在suqaring i=i*i中;i的值变成了9,所以在下一次迭代中,增量运算符i++实际上会增加9,而不是3,所以尝试计算除i之外的其他变量的平方,然后在每次迭代中将其添加到sumofsquare中。
其次,当您使用第二个first for循环计算平方和时,此时循环完成后,内存中的后端变量(i)中存储了一些值。现在在第二个for循环中,当你计算sum的平方时,你没有将i初始化为1,但是我在第一个for循环的内存中已经有了一些值。因此,在第二个循环中,将变量(i)初始化为(1),以便计算1到100之间的平方和。
#include<iostream>
using namespace std;
int main()
{
int sumOfSquare = 0; int add=0;
for(int i=1; i<=100; i++)
{
add = i*i;
sumOfSquare += add;
};
int squareOfSum = 0;
for(int i=1; i<=100; i++)
{
squareOfSum +=i;
};
squareOfSum = squareOfSum * squareOfSum;
int difference = squareOfSum - sumOfSquare;
cout<<difference;
}
https://stackoverflow.com/questions/58577243
复制相似问题