PTA 程序设计考试复习——大勾股定理

1-29 大勾股定理

分数 10

作者 陈越

单位 浙江大学

大勾股定理是勾股定理的推广:对任何正整数 n 存在 2n+1 个连续正整数,满足前 n+1 个数的平方和等于后 n 个数的平方和。例如对于 n=1 有 32+42=52;n=2 有 102+112+122=132+142 等。给定 n,本题就请你找出对应的解。

输入格式:

输入在一行中给出正整数 n(≤104)。

输出格式:

分两行输出满足大勾股定理的解,格式如下:

1
2
a[0]^2 + a[1]^2 + ... + a[n]^2 =
a[n+1]^2 + ... + a[2n]^2

其中解的数列 a[0] ... a[2n] 按递增序输出。注意行首尾不得有多余空格。

输入样例:

1
3

输出样例:

1
2
21^2 + 22^2 + 23^2 + 24^2 =
25^2 + 26^2 + 27^2

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;

int main() {
int n;
cin >> n;

// 计算起始数字
int start = n * (2 * n + 1);

// 输出前n+1个数的平方和
for (int i = 0; i <= n; ++i) {
if (i > 0) {
cout << " + ";
}
cout << start + i << "^2";
}
cout << " =\n";

// 输出后n个数的平方和
for (int i = n + 1; i <= 2 * n; ++i) {
if (i > n + 1) {
cout << " + ";
}
cout << start + i << "^2";
}
cout << endl;

return 0;
}
  • 这题太妙了完全:
1
2
// 计算起始数字
int start = n * (2 * n + 1);
  • 这个公式是要推导的,我直接用

我自己写的就超时了:

我的超时代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using namespace std;
long f(int n)
{
return n*n;
}
int main()
{
int n;
cin>>n;
int i=3;
while(1) {
int sum1=f(i);
int sum2=f(i+n+1);
for(int j=0;j<n;j++) {
sum1+=f(i+j+1);
}
for(int k=0;k<n-1;k++) {
sum2 += f(i + n +k+ 2);
}
if(sum1==sum2) {
break;
}else{
i++;
}
}
for(int l=0;l<n;l++) {
cout<<i<<"^2 + ";
}
cout<<i+n<<"^2 ="<<endl;
for(int l=0;l<n-1;l++) {
cout<<i+n+l+1<<"^2 + ";
}
cout<<i+n+n<<"^2";
}

推导:

直接用数学公式推