【蓝桥杯】43699-四平方和

news2024/12/21 21:12:32

四平方和

题目描述

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 4 个正整数的平方和。如果把 0 包括进去,就正好可以表示为 4 个数的平方和。
比如:
5=02+02+12+22
7=12+12+12+22;
对于一个给定的正整数,可能存在多种平方和的表示法。

要求你对 4 个数排序:
0≤a≤b≤c≤d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。

输入描述

程序输入为一个正整数 N(N<5×106)。

输出描述

要求输出 4 个非负整数,按从小到大排序,中间用空格分开

输入输出样例

示例

输入
12
输出
0 2 2 2

解题思路

穷举法
对于给定的正整数 N,我们可以使用穷举法来找到所有可能的表示法。穷举法的思路是,我们逐个检查所有可能的 a、b、c 和 d 值,其中 a、b、c、d 都是非负整数,并且满足 a≤b≤c≤d。
优化穷举范围
为了提高效率,我们可以对 a、b、c 的取值范围进行优化。由于 a、b、c、d 都是非负整数,并且 a≤b≤c≤d,所以 a 的最大值可以取到 N 的平方根,因为 a 的平方不可能大于 N。同理,b 的取值范围可以从 a 开始,最大值可以取到 (N - a2) 的平方根。c 的取值范围可以从 b 开始,最大值可以取到 (N - a2 - b2) 的平方根。
计算 d 的值
在确定了 a、b、c 的值之后,我们可以计算 d 的值。d 的值是 (N - a2 - b2- c2) 的平方根,并且 d 必须是一个整数。
检查是否满足条件
如果 a2 + b2 + c2 + d2 等于 N,那么我们就找到了一个满足条件的表示法。由于我们按照从小到大的顺序进行穷举,所以找到的第一个表示法就是最小的表示法。
输出结果
最后,我们将找到的四个数按照从小到大的顺序输出,中间用空格分隔。
复杂度分析
这个算法的时间复杂度是 O (N3/2),因为我们使用了三层嵌套循环,每层循环的次数最多是 N 的平方根。这个算法在 N 的值不是很大时是可行的,但是对于非常大的 N,这个算法可能会非常慢。

代码实现

Python 实现

def find_four_squares(n):
    # 遍历所有可能的 a 值,从 0 到 sqrt(n)
    for a in range(int(n**0.5) + 1):
        # 遍历所有可能的 b 值,从 a 到 sqrt(n - a^2)
        for b in range(a, int((n - a*a)**0.5) + 1):
            # 遍历所有可能的 c 值,从 b 到 sqrt(n - a^2 - b^2)
            for c in range(b, int((n - a*a - b*b)**0.5) + 1):
                # 计算 d 的平方值
                d_squared = n - a*a - b*b - c*c
                # 检查 d_squared 是否为非负数
                if d_squared >= 0:
                    # 计算 d 的值
                    d = int(d_squared**0.5)
                    # 检查 d 是否为整数
                    if d * d == d_squared:
                        # 返回结果,确保 a <= b <= c <= d
                        return f"{a} {b} {c} {d}"
    # 如果没有找到,则返回报错信息
    return "No solution found"

# 输入一个正整数n
number = int(input())

# 获取结果并输出
result = find_four_squares(number)
print(result)

JAVA实现

import java.util.Scanner;

public class FourSquares {
    public static String findFourSquares(int n) {
        // 遍历所有可能的a值,从0到sqrt(n)
        for (int a = 0; a <= Math.sqrt(n); a++) {
            // 遍历所有可能的b值,从a到sqrt(n - a^2)
            for (int b = a; b <= Math.sqrt(n - a * a); b++) {
                // 遍历所有可能的c值,从b到sqrt(n - a^2 - b^2)
                for (int c = b; c <= Math.sqrt(n - a * a - b * b); c++) {
                    // 计算d的平方值
                    int dSquared = n - a * a - b * b - c * c;
                    // 检查d_squared是否为非负数
                    if (dSquared >= 0) {
                        // 计算d的值
                        int d = (int) Math.sqrt(dSquared);
                        // 检查d是否为整数
                        if (d * d == dSquared) {
                            // 返回结果,确保a <= b <= c <= d
                            return a + " " + b + " " + c + " " + d;
                        }
                    }
                }
            }
        }
        // 如果没有找到,则返回报错信息
        return "No solution found";
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 输入一个正整数n
        int number = scanner.nextInt();
        // 获取结果并输出
        String result = findFourSquares(number);
        System.out.println(result);
        scanner.close();
    }
}

C++实现

#include <iostream>
#include <cmath>
using namespace std;

string findFourSquares(int n) {
    // 遍历所有可能的a值,从0到sqrt(n)
    for (int a = 0; a <= sqrt(n); a++) {
        // 遍历所有可能的b值,从a到sqrt(n - a^2)
        for (int b = a; b <= sqrt(n - a * a); b++) {
            // 遍历所有可能的c值,从b到sqrt(n - a^2 - b^2)
            for (int c = b; c <= sqrt(n - a * a - b * b); c++) {
                // 计算d的平方值
                int dSquared = n - a * a - b * b - c * c;
                // 检查d_squared是否为非负数
                if (dSquared >= 0) {
                    // 计算d的值
                    int d = (int)sqrt(dSquared);
                    // 检查d是否为整数
                    if (d * d == dSquared) {
                        // 返回结果,确保a <= b <= c <= d
                        return to_string(a) + " " + to_string(b) + " " + to_string(c) + " " + to_string(d);
                    }
                }
            }
        }
    }
    // 如果没有找到,则返回报错信息
    return "No solution found";
}

int main() {
    int number;
    cin >> number;
    // 获取结果并输出
    string result = findFourSquares(number);
    cout << result << endl;
    return 0;
}

C实现

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 函数用于查找四个平方数之和等于给定数n的四个整数
char* findFourSquares(int n) {
    static char result[50];  // 用于存储最终结果字符串,足够长以容纳结果和提示信息

    for (int a = 0; a <= (int)sqrt(n); a++) {
        for (int b = a; b <= (int)sqrt(n - a * a); b++) {
            for (int c = b; c <= (int)sqrt(n - a * a - b * b); c++) {
                int dSquared = n - a * a - b * b - c * c;
                if (dSquared >= 0) {
                    int d = (int)sqrt(dSquared);
                    if (d * d == dSquared) {
                        // 格式化拼接结果字符串
                        sprintf(result, "%d %d %d %d", a, b, c, d);
                        return result;
                    }
                }
            }
        }
    }
    // 如果没找到,将提示信息存入结果字符串
    sprintf(result, "No solution found");
    return result;
}

int main() {
    int number;
    scanf("%d", &number);

    char* output = findFourSquares(number);
    printf("%s\n", output);

    return 0;
}

运行结果

>>> 12
0 2 2 2

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十、从0开始卷出一个新项目之瑞萨RZN2L rzn-fsp v2.0.0 Release Notes

目录 一、概述 二、Github地址 三、 Features Added 3.1 Developer Assistance feature support added. 3.2 Multiplex interrupts support added. 四、Bug Fixes and Improvements 4.1 Added a noncache section for user applications. 4.2 Unified case of asm inst…

VM16+解压版CentOS7安装和环境配置教程(2024年12月20日)

VM16解压版CentOS7安装和环境配置教程-2024年12月20日 一、下载安装包二、vm安装三、解压版CentOS7安装四、CentOS设置静态IP 因为很多同学觉得配置CentOS7好麻烦&#xff0c;我特地提供了一个已经配置好的现成镜像&#xff0c;来简化操作本篇来记录过程。 如果你在看到这篇文章…

PC寄存器(Program Counter Register)jvm

在JVM(Java虚拟机)中,PC寄存器(Program Counter Register)扮演着至关重要的角色。以下是对JVM中PC寄存器的详细解释: 一、定义与功能 定义: JVM中的PC寄存器,也被称为程序计数器,是对物理PC寄存器的一种抽象模拟。它用于存储当前线程所执行的字节码指令的地址,即指…

学习threejs,scene.overrideMaterial全局材质效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.2 ☘️THREE.Scene 场景1.2 ☘️…

【原生js案例】前端封装ajax请求及node连接 MySQL获取真实数据

上篇文章&#xff0c;我们封装了ajax方法来请求后端数据&#xff0c;这篇文章将介绍如何使用 Node.js 来连接 MySQL&#xff0c;并对数据库进行操作。 实现效果 代码实现 后端接口处理 const express require("express"); const connection require("../da…

FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.2,RTP协议-RTP协议概述,协议详情

前提: 为什么要学习 RTP&#xff08;Real-time Transport Protocol&#xff09;重点 简介&#xff1a;RTP是一个实时传输媒体数据的协议&#xff0c;通常与RTSP一起使用。它负责在网络上传输音视频数据。特点&#xff1a;RTP通过UDP或TCP传输媒体数据&#xff0c;提供时间戳和序…

Chapter 18 CMOS Processing Technology

Chapter 18 CMOS Processing Technology 这一章介绍CMOS制造工艺, 介绍wafer制作, 光刻, 氧化, 离子注入, 沉淀(deposition)和刻蚀. 然后介绍MOS管制作流程, 最后介绍被动器件和互连接. 18.1 General Considerations sheet resistance为方块电阻. R ρL/(W t), 方块电阻定…

服务器数据恢复—V7000存储中多块磁盘出现故障导致业务中断的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台V7000存储上共12块SAS机械硬盘&#xff08;其中1块是热备盘&#xff09;&#xff0c;组建了2组Mdisk&#xff0c;创建了一个pool。挂载在小型机上作为逻辑盘使用&#xff0c;小型机上安装的AIXSybase。 服务器存储故障&#xff1a; V7…

LabVIEW中的“Synchronize with Other Application Instances“

在LabVIEW中&#xff0c;“Synchronize with Other Application Instances”是一个常见的提示或错误&#xff0c;通常出现在尝试并行运行多个LabVIEW实例时&#xff0c;特别是当你打开多个VI或项目时。这个问题可能影响程序的执行流程&#xff0c;导致不同实例之间的数据同步或…

简单配置,全面保护:HZERO审计服务让安全触手可及

HZERO技术平台&#xff0c;凭借多年企业资源管理实施经验&#xff0c;深入理解企业痛点&#xff0c;为您提供了一套高效易用的审计解决方案。这套方案旨在帮助您轻松应对企业开发中的审计挑战&#xff0c;确保业务流程的合规性和透明度。 接下来&#xff0c;我将为大家详细介绍…

【论文研读】U-DiTs:在U型扩散Transformer中引入下采样Token,以更低计算成本超越DiT-XL/2

推荐理由 这篇论文提出了一种新的U型扩散Transformer模型&#xff08;U-DiT&#xff09;&#xff0c;该模型通过对自注意力机制中的查询、键和值进行下采样&#xff0c;有效减少了计算冗余&#xff0c;同时提高了性能。论文中的研究不仅包含理论分析和实验验证&#xff0c;还展…

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…

SDMTSP:黑翅鸢算法(Black-winged kite algorithm,BKA)求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

一、黑翅鸢算法BKA 黑翅鸢算法&#xff08;Black-winged kite algorithm&#xff0c;BKA&#xff09;由Wang Jun等人于2024年提出&#xff0c;该算法受黑翅鸢的迁徙和掠食行为启发而得。BKA集成了柯西突变策略和领导者策略&#xff0c;增强了算法的全局搜索能力&#xff0c;提…

[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words

python有哪些关键字_keyword_list_列表_reserved_words 回忆上次内容 hello world 不是 从来就有的 来自于 c语言 print、小括号 和 双引号 也来自于 c语言 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; python 标识符 的 命名规则 依然 完全 学习…

OpenCV 学习记录:首篇

最近在学习机器视觉&#xff0c;希望能通过记录博客的形式来鞭策自己坚持学完&#xff0c;同时也把重要的知识点记录下来供参考学习。 1. OpenCV 介绍与模块组成 什么是 OpenCV&#xff1f; OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软…

GTID详解

概念和组成 1&#xff0c;全局事务表示&#xff1a;global transaction identifiers 2, GTID和事务一一对应&#xff0c;并且全局唯一 3&#xff0c;一个GTID在一个服务器上只执行一次 4&#xff0c;mysql 5.6.5开始支持 组成 GTID server_uuid:transaction_id 如&#xf…

[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算

在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…

项目管理工具Maven(一)

Maven的概念 什么是Maven 翻译为“专家”&#xff0c;“内行”Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。什么是理想的项目构建&#xff1f; 高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准…

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>找出所有子集的异或总和再求和

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; private int ret;//返回周结果private int path;//枚举一个元素就异或进去public int subsetXORSum(int[] nums) {dfs(nums, 0);return ret;} private void dfs(int[] nums, int pos){ret path;for(int i pos; i <…