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 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); for (int i = 0; i <= n; ++i) { if (i > 0) { cout << " + "; } cout << start + i << "^2"; } cout << " =\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"; }
|
推导:
直接用数学公式推