Q:对于输入的自然数 n ∈[1,1000],判定能否存在 2 * n + 1个连续的自然数,满足: 左边 n + 1个数的平方和等于右边 n 个数的平方和。若存在,则输出;否则则输出No.
例:
输入:2
输出:10 11 12 13 14
我的解题思路如下:
1、使用一个窗口大小为 2n + 1 的窗口在1 到 1000 内滑动。
2、在初始时,即 i = 1时,我们能求出Sum = RightSum - LeftSum;
3、在窗口移动期间,经过笔算,得到在窗口最小元素为 i 的情况下,ΔRS-LF = 2n² - 1 - 2i。(即RightSum - LeftSum)的增量。
4、那么,我们则需要通过计算Sum = Sum + ΔRS-LF,来取得Sum = 0 的情形——这种情况下,即满足RightSum - LeftSum = 0,则不需要再次循环,因故退出。否则,循环将持续,直到 i 的值超过1000,这时候输出No。
C语言实现如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i;
int sum = 0;
scanf("%d", &n);
for (int m = 1; m <= 1 + n; m++)sum = sum - m * m;
for (int m = 2 + n; m <= 1 + 2 * n; m++)sum = sum + m * m;
for (i = 1; i <= 1000; i++)
{
if (sum == 0)break;
sum = sum + 2 * n * n - 1 - 2 * i;
}
if (i <= 1000)
for (int j = i; j <= i + 2 * n; j++)
printf("%d ", j);
else printf("No!\n");
return 0;
}