四平方和

题目描述

c2405ab5de7a44f3bc9e77c3f6e72339.png

输入描述

8152c81ce8534cbebfa99427e9acd455.png

输出描述

要求输出 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;
}

代码分析

  1. 循环结构

    • 外层循环 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 ) 为止。
  2. 计算条件

    • 在每次循环中,计算剩余的值 t = n - a*a - b*b - c*c
    • 使用 sqrt(t) 计算 t 的平方根,并将结果存入 d
  3. 判断条件

    • 判断 d*d == t 是否成立,如果成立,说明找到了满足条件的 d
  4. 输出结果

    • 如果找到了满足条件的 (a, b, c, d),则输出这组解,并立即结束程序。

总结

这段代码通过三重嵌套循环,穷举所有可能的非负整数解 (a, b, c, d),并判断是否满足 ( a^2 + b^2 + c^2 + d^2 = n )。在找到第一个满足条件的解后立即输出,并结束程序运行。由于没有要求输出所有解,因此只输出找到的第一个解即可。

 

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值