题目描述
输入描述
输出描述
要求输出 4 个非负整数,按从小到大排序,中间用空格分开
输入输出样例
示例
输入
12
输出
0 2 2 2
运行限制
- 最大运行时间:3s
- 最大运行内存: 256M
总通过次数: 5635 | 总提交次数: 6918 | 通过率: 81.5%
难度: 困难 标签: 2016, 暴力, 省赛
代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin>>n; // 从标准输入读取整数 n
for(int a=0;a*a<=n;a++) { // 第一层循环,变量 a,条件是 a 的平方小于等于 n
for(int b=a;a*a+b*b<=n;b++) { // 第二层循环,变量 b,条件是 a 的平方加 b 的平方小于等于 n
for(int c=b;a*a+b*b+c*c<=n;c++) { // 第三层循环,变量 c,条件是 a 的平方加 b 的平方加 c 的平方小于等于 n
int t = n-a*a-b*b-c*c; // 计算剩余的部分
int d = sqrt(t); // 计算剩余部分的平方根
if(d*d == t ) { // 如果剩余部分的平方根的平方等于剩余部分本身,即找到符合条件的解
cout<<a<<' '<<b<<' '<<c<<' '<<d; // 输出解
return 0; // 结束程序
}
}
}
}
return 0;
}
代码分析
-
循环结构:
- 外层循环
for(int a=0;a*a<=n;a++)
:从a = 0
开始,每次增加a
,直到 ( a^2 ) 大于 ( n ) 为止。 - 中层循环
for(int b=a;a*a+b*b<=n;b++)
:从b = a
开始,每次增加b
,直到 ( a^2 + b^2 ) 大于 ( n ) 为止。 - 内层循环
for(int c=b;a*a+b*b+c*c<=n;c++)
:从c = b
开始,每次增加c
,直到 ( a^2 + b^2 + c^2 ) 大于 ( n ) 为止。
- 外层循环
-
计算条件:
- 在每次循环中,计算剩余的值
t = n - a*a - b*b - c*c
。 - 使用
sqrt(t)
计算t
的平方根,并将结果存入d
。
- 在每次循环中,计算剩余的值
-
判断条件:
- 判断
d*d == t
是否成立,如果成立,说明找到了满足条件的d
。
- 判断
-
输出结果:
- 如果找到了满足条件的
(a, b, c, d)
,则输出这组解,并立即结束程序。
- 如果找到了满足条件的
总结
这段代码通过三重嵌套循环,穷举所有可能的非负整数解 (a, b, c, d)
,并判断是否满足 ( a^2 + b^2 + c^2 + d^2 = n )。在找到第一个满足条件的解后立即输出,并结束程序运行。由于没有要求输出所有解,因此只输出找到的第一个解即可。