我正在编写这个程序来打印多个测试用例的两个给定数字之间的连续奇数之和。它将首先获取 testcase 的 input 并循环运行,然后它将获取 两个数字 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;
}
#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。每次获取输入时都必须初始化
正如 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);