打印时,变量将之前的值与 C 中的新值相加

问题描述 投票:0回答:2

我正在编写这个程序来打印多个测试用例的两个给定数字之间的连续奇数之和。它将首先获取 testcaseinput 并循环运行,然后它将获取 两个数字 X 和 Y 作为 inputs。输出将是 X 和 Y 之间所有奇数的总和。(不包括 X 和 Y)

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

int main()
{
    int testcase,sum=0;
    scanf("%d", &testcase);
    for (int i=0; i<testcase; i++)
    {
        int x,y;
        scanf("%d %d", &x, &y);
        if (x>y)
        {
            for (int i=y+1; i<=x-1; i++)
            {
                if (i%2!=0)
                {
                    sum=sum+i;
                }
            }
                printf("%d\n", sum);
        }
        else
        {
            for (int i=x+1; i<=y-1; i++)
            {
                if (i%2!=0)
                {
                    sum=sum+i;
                }
            }
            printf("%d\n", sum);
        }

    }
    return 0;
}

程序运行时,sum变量存储之前的结果,并将其与新的结果相加,然后打印。这就是终端的样子 - Program keeps adding previous value with the new one before printing

c for-loop variable-assignment
2个回答
0
投票

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

int main()
{
    int testcase;
    scanf("%d", &testcase);
    for (int i=0; i<testcase; i++)
    {
        int sum=0;
        int x,y;
        char * in="Input";
        printf("Input %d \n", i);
        scanf("%d %d", &x, &y);
        if (x>y)
        {
            for (int i=y+1; i<=x-1; i++)
            {
                if (i%2!=0)
                {
                    sum=sum+i;
                }
            }
                printf("%d\n", sum);
        }
        else
        {
            for (int i=x+1; i<=y-1; i++)
            {
                if (i%2!=0)
                {
                    sum=sum+i;
                }
            }
            printf("%d\n", sum);
        }

    }
    return 0;
}

在循环内初始化 sum=0。每次获取输入时都必须初始化


0
投票

正如 Arun 已经回答的那样,OP 需要在每种情况之间重置

sum
。然而,也可以采用不同的方法来计算总和。我会专注于此。

在这种情况下,一点数学知识就可以提高性能。如果

y
x
之间的差异很大,那么程序必须迭代多次才能计算结果。

事实上,我们可以推导出一个明确的公式。假设

x<y
x>y
的情况是对称的,即只需将
x
替换为
y
并将
y
替换为
x
)。

首先,在不改变总和的情况下使端点均匀:

  x2 = (x+1) & ~1;  // Round up to nearest even number
  y2 = y & ~1;      // Round down to nearest even number

然后计算端点之间(以及排除)的奇数整数的数量:

  n = (y2-x2) / 2;

现在,请注意总和是:

(x2+1) + (x2+3) + ... + (x2 + (2*n-1)) =

n * x2 + (1 + 3 + ... + (2*n-1)) =

n * x2 + n * n =

n * (x2 + n)

(这利用了前 n 个奇数之和为 n^2 的事实)

因此,结果是:

   sum = n * (x2 + n);
© www.soinside.com 2019 - 2024. All rights reserved.