计算题:连续自然数的平方和

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;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值