【蓝桥杯】43699-四平方和

四平方和

题目描述

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ECharts散点图-SymbolShapeMorph,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

会话控制(cookie、session 和 token)

1. 介绍 所谓会话控制就是 对会话进行控制HTTP 是一种无状态的协议&#xff0c;它没有办法区分多次的请求是否来自于同一个客户端&#xff0c; 无法区分用户&#xff0c;而产品中又大量存在的这样的需求&#xff0c;所以我们需要通过 会话控制 来解决该问题。 常见的会话控制…

「九」HarmonyOS 5 端云一体化实战项目——「M.U.」应用云侧开发云数据库

1 立意背景 M. 代表 “我”&#xff0c;U. 代表 “你”&#xff0c;这是一款用于记录情侣从相识、相知、相恋、见家长、订婚直至结婚等各个阶段美好记忆留存的应用程序。它旨在为情侣们提供一个专属的空间&#xff0c;让他们能够将一路走来的点点滴滴&#xff0c;如初次相遇时…

双臂机器人

目录 一、双臂机器人简介 二、双臂机器人系统的组成 三、双臂机器人面临的主要挑战 3.1 协调与协同控制问题 3.2 力控制与柔顺性问题 3.3 路径规划与轨迹优化问题 3.4 感知与环境交互 3.5 人机协作问题 3.6 能源与效率问题 3.7 稳定性与可靠性问题 四、双臂机器人…

Lua语言入门 - Lua 面向对象

Lua 面向对象 面向对象编程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;是一种非常流行的计算机编程架构&#xff0c;通过创建和操作对象来设计应用程序。 以下几种编程语言都支持面向对象编程&#xff1a; CJavaObjective-CSmalltalkC#Ruby Lua 是…

电子电器架构 ---整车区域控制器

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

机器人国际会议IROS论文latex模板

机器人国际会议IROS论文latex模板 文档 root.tex 可以配置为 US Letter 纸或 A4。请注意以下重要行&#xff1a;\documentclass[letterpaper, 10 pt, Conference]{ieeeconf} % 如果需要 a4paper&#xff0c;请注释掉此行%\documentclass[a4paper, 10pt, Conference]{ieeeconf} …

ubuntu22.04编译安装Opencv4.8.0+Opencv-contrib4.8.0教程

本章教程,主要记录在Ubuntu22.04版本系统上编译安装安装Opencv4.8.0+Opencv-contrib4.8.0的具体过程。 一、下载opencv和opencv-contrib包 wget https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip wget https://github.com/opencv/opencv_contrib/archive/refs/…

Java中的方法重写:深入解析与最佳实践

在Java编程中&#xff0c;方法重写&#xff08;Method Overriding&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念之一。它允许子类提供一个与父类中同名方法的具体实现&#xff0c;从而实现多态性&#xff08;Polymorphism&#xff09;。本文将深入探讨Java…

基础电路的学习

1、戴维南定理 ①左边的图可简化为一个电阻&#xff0b;一个电压源。② ③电压源可相当于开路。将R2移到左边&#xff0c;R1和R2相当于并联。RR1//R2 Rx和Rt相等时&#xff0c;灵敏度最大&#xff0c;因此使Rt10K。 104电容是0.1uf。 三位数字的前两位数字为标称容量的有效数…

麒麟操作系统服务架构保姆级教程(二)sersync、lsync备份和NFS持久化存储

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 上篇文章我们说到rsync虽好&#xff0c;但是缺乏实时性&#xff0c;在实际应用中&#xff0c;咱们可以将rsync写进脚本&#xff0c;然后写进定时任务去备份&#xff0c;如果每天凌晨1&#xff1a;00…

使用visnode做节点管理

背景 visnode起源于解决本人在研究生期间做学术研究时遇到的困惑。 当时的项目涉及到比较多的参数&#xff0c;需要做参数调整优化&#xff0c;每一次调整参数都是在上一组最优的一些参数组合中做微调&#xff0c;然后重新计算&#xff0c;每一次计算又会产生大量的文件&…

28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强

A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法&#xff1a;无模型水下图像增强方法&#xff1a;基于深度学习的水下图像增强方法&#xff1a; 论文方法概述像素分布…

今日-冬至

夏尽秋分日 春生冬至时 今天17时21分 我们迎来冬天的第四个节气 冬至 冬至是北半球全年中 白天最短、黑夜最长的一天 过了今天 阳光的照射将逐渐增多 白天的时间也会越来越长 温暖和春意正在一点点靠近 我国民间有“数九”的习俗 又称“冬九九”“交九” 从冬至起&…

WebRTC搭建与应用(一)-ICE服务搭建

WebRTC搭建与应用(一) 近期由于项目需要在研究前端WebGL渲染转为云渲染&#xff0c;借此机会对WebRTC、ICE信令协议等有了初步了解&#xff0c;在此记录一下&#xff0c;以防遗忘。 第一章 ICE服务搭建 文章目录 WebRTC搭建与应用(一)前言一、ICE是什么&#xff1f;二、什么…

LabVIEW伸缩臂参数监控系统

LabVIEW开发伸缩臂越野叉车参数监控系统主要应用于工程机械中的越野叉车&#xff0c;以提高车辆的作业效率和故障诊断能力。系统通过PEAK CAN硬件接口和LabVIEW软件平台实现对叉车作业参数的实时监控和故障分析&#xff0c;具有良好的实用性和推广价值。 系统组成 系统主要由P…

VR博物馆能模拟哪些历史场景?

VR博物馆以其卓越的模拟能力&#xff0c;能够带领观众穿越时空&#xff0c;体验从古罗马的斗兽场到中世纪的欧洲城堡&#xff0c;从文艺复兴的佛罗伦萨到工业革命的蒸汽机&#xff0c;再到二战的紧张战场&#xff0c;每一种历史场景都栩栩如生&#xff0c;让人仿佛亲历其境&…

网络安全防范

实践内容 学习总结 PDR&#xff0c;$$P^2$$DR安全模型。 防火墙&#xff08;Firewall&#xff09;&#xff1a; 网络访问控制机制&#xff0c;布置在网际间通信的唯一通道上。 不足&#xff1a;无法防护内部威胁&#xff0c;无法阻止非网络传播形式的病毒&#xff0c;安全策略…

投标心态:如何在“标海战术”中保持清醒的头脑?

在竞争激烈的市场环境下&#xff0c;“标海战术”——即大规模参与投标——已经成为许多企业争取市场份额的重要策略。然而&#xff0c;盲目追求投标数量可能导致资源浪费、团队疲劳以及战略目标的模糊化。在这种高强度的竞争模式中&#xff0c;如何保持清醒的头脑&#xff0c;…

ICLR 2025 | 时间序列(Time Series)高分论文总结

ICLR2025已经结束了讨论阶段&#xff0c;进入了meta-review阶段&#xff0c;分数应该不会有太大的变化了&#xff0c;本文总结了其中时间序列(Time Series)高分的论文。如有疏漏&#xff0c;欢迎大家补充。 挑选原则&#xff1a;均分要大于等于6&#xff08;≥6&#xff0c;即…