这是我应该做的:
编写一个程序,读取一个正整数并显示最大正整数 n,其总和 1^2 + 2^2 + 3^2 + ... + n^2 小于给定数字。
到目前为止,我只能将所有自然数的总和相加,直到 n:
#include <stdio.h>
int main ()
{
unsigned int n;
int sum = 0;
int i;
sum = 0;
printf("Print your number");
scanf("%d", &n);
for (i = 1; i <= n; ++i)
{
sum += i;
}
printf("sum = %d", sum);
return 0;
}
感谢您的帮助!
你可以试试这个
#include <stdio.h>
int max_positive_integer(int given_number)
{
int sum = 0;
int n = 1;
while (sum < given_number) {
sum += n * n;
n++;
}
printf("sum= %dn", sum);
return n;
}
int main ()
{
printf("Print your number:");
int n;
scanf("%d", &n);
int max_integer = max_positive_integer(n);
printf("max_integer = %dn", max_integer);
return 0;
}
如何在循环中对一系列平方求和是容易的部分
sum = 0;
for (n=0; TBD; n++) {
sum += n*n;
}
printf(..., n);
诀窍是何时停止给定"总和...小于给定的数字。
代码可以使用
for (n=0; sum + n*n < given_number; n++) {
sum += n*n;
}
n--;
这在一定程度上是有效的,但似乎是多余的。 它有一个问题,sum + i*i
可能会溢出。 也许每次都减去i*i
,因为我们不需要报告总和,只需n
.
for (n=0; n*n < given_number; n++) {
given_number -= n*n;
}
n--;
这样做的好处是,随着n*n
的增加,右侧的比较会变小,但n*n
不会溢出。 注意:n
大约是given_number
的立方根
如果你想避免循环,研究前n平方和
正如@user4581301评论的那样,将"%u"
与unsigned
一起使用。