使用While循环完成以下等式

时间:2016-02-17 21:19:58

标签: c

我正在尝试编写一个程序,提示用户输入数字x,并找到最大的n 满足以下等式: 1²+2²+3²+ ... + n²< x

首先,我需要知道我的程序出错了什么,我一直试图将它修改几个小时才能获得无限循环等等。我知道这是我逻辑中的错误;我只需要知道用什么逻辑来完成问题。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
    int number;

    printf("Please enter a number\n");
    scanf("%d", &number);

    double c = 1; // stores number
    double n = 0;

    while (n < number)
    {
        n = c + pow(c, 2);
        c++;    
    }    
    printf("The largest n is %lf\n", c);
    printf("%lf", n);

    return 0;    
}

4 个答案:

答案 0 :(得分:1)

你在这里。

#include <stdio.h>

int main( void )
{
    while ( 1 )
    {        
        printf( "Enter a positive number (0-exit): " );
        unsigned int number;

        if ( !( scanf( "%u", &number ) == 1 ) || number == 0 ) break;

        unsigned int n = 0;
        unsigned long long sum = 0;

        while ( ( sum + ( unsigned long long )( n + 1 ) * ( n + 1 ) ) < number ) 
        {
            ++n;
            sum += ( unsigned long long )n * n;
        }            

        printf( "The largest n is %u and the corresponding sum is %llu\n", n, sum );
    }       
}    

如果要输入例如65然后输入0,那么输出可能会显示为

Enter a positive number (0-exit): 65
The largest n is 5 and the corresponding sum is 55
Enter a positive number (0-exit): 0

如果您愿意,可以将变量number的类型从unsigned int更改为double。在这种情况下,您需要做的就是更改scanf的格式说明符。

至于你的程序,那么循环本身

while (n < number)
{
    n = c + pow(c, 2);
    c++;    
} 

是错误的,因为在循环内n可能会变得大于数字,c会增加。

也代替

n = c + pow(c, 2);

必须有

n += c * c;

答案 1 :(得分:1)

你应该使用整数而不是双倍,并记住最后递减c(因为最后一个c是第一个实际上比输入更大的)。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
    int number;

    printf("Please enter a number\n");
    scanf("%i", &number);

    int c = 1; // stores number
    int n = 0;

    while (n < number) {
        n += c*c;
        c++;    
    }    
    printf("The largest n is %i\n", --c);

    return 0;    
}

答案 2 :(得分:0)

我认为您的程序没有计算正确的c值,如果您只是在每次迭代中向c添加1,那么最后c将等于迭代次数,试试这个

#include <stdio.h>
#include <math.h>

int
main(void)
{
    double x = 0;
    double y = 0;
    double z = 0;
    if (scanf("%lf", &x) != 1)
        return -1;
    for (double n = 0 ; y < x ; ++n)
    {
        z = y; // Store the value before `y' >= `x'
        y = y + pow(n, 2); // Update `y'
    }
    fprintf(stdout, "%f\n", z);
    return 0;
}

答案 3 :(得分:0)

n = c + pow(c, 2);

不做您认为会做的事情。为了正确地求和该值,因为您从未正确保存过以前的总和。

int main(void) {    
    int number;

    printf("Please enter a number\n");
    scanf("%d", &number);

    double c = 1; //stores number
    double n = 0;
    double prev = 0;

    while (n<number)
    {
        prev = n;
        n += pow(c, 2);
        c++;

    }

    printf("The largest n is %lf\n", prev);

    return 0;
}