求解亲和数

news2024/10/7 10:16:57

  【问题描述】

  古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身 的约数)之和为: 1+2+4+5+10+11+20+22+44+55+110=284。而284的所有真约数为1、2、4、71、142,加起来恰好为220。人 们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数 之和,则这两个数就是亲和数。

  220和284是人类最早发现,又是最小的一对亲和数。第二对亲和数(17296,18416)直到2000多年后的1636年才由法国数学家费马发现。1638年,法国数学家笛 卡儿发现了第三对亲和数,而大数学家欧拉在1747年一下子给出了30对亲和数, 1750年又增加到60对。到目前为止,人类已经发现了近千对亲和数。然而,令人惊 奇的是,第二对最小的亲和数(1184,1210)竟然被数学家们遗漏了,直到1886年才 由意大利的一位16岁男孩发现。

  这里不要求你找到一对亲和数,而是对于每个正整数n,求出这个数的真约数之和。

  比如,n=220,答案是284,如果n=284,答案是220。

  【输入形式】

  有多组测试数据,每组测试数据一行,是一个正整数n, n=0意味着输入结束并且不需要处理。

  40%的测试数据1 ≤ n≤ 10(3);30%的测试数据1 ≤ n≤ 10(4);

  20%的测试数据1 ≤ n≤ 10(5);10%的测试数据1 ≤ n≤ 10(6);

  【输出形式】

  对于每组测试数据,输出一行,包含一个正整数,表示n的真约数之和。

  【样例输入】

220
284
0

  【样例输出】

284
220

解题思路

问题关键:如何高效地找到一个数的所有真约数之和。一个直观的方法是遍历从1到n-1的所有数,检查它们是否是n的约数,并计算它们的和。然而,这种方法在n非常大时会非常慢。更高效的方法是只遍历到\sqrt{n},因为大于\sqrt{n}的约数可以通过n / 约数 得到。这样可以显著减少计算量。

  1. 对于每个输入的正整数n,初始化一个变量sum来存储真约数之和,初始值为1(因为1是所有正整数的真约数)。

  2. 从2遍历到\sqrt{n},对于每个i,检查它是否是n的约数。

    1. 如果i是n的约数,检查i是否等于 n / i(即检查是否是平方根)。

      • 如果是,只加i到sum(因为在这种情况下,i和 n / i实际上是同一个数)。

      • 如果不是,将 i 和 n / i 都加到sum。

  3. 特别注意,如果n为1,其真约数之和应为0,因为1没有真约数。

  4. 输出sum。

Java代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            int n = scanner.nextInt();
            if (n == 0) break; // 输入结束
            System.out.println(sumOfDivisors(n));
        }
        scanner.close();
    }

    // 计算并返回n的真约数之和
    private static int sumOfDivisors(int n) {
        if (n == 1) return 0; // 1没有真约数
        int sum = 1; // 所有数都至少有一个真约数1
        // 只需要检查到sqrt(n),因为大于sqrt(n)的约数可以通过n / 约数得到
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                sum += i;
                if (i != n / i) { // 避免平方根被加两次
                    sum += n / i;
                }
            }
        }
        return sum;
    }
}

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

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

相关文章

H3C ripng实验(ipv6)

H3C ripng实验&#xff08;ipv6&#xff09; 实验需求 按照图示为路由器配置IPv6地址 所有路由器运行ripng&#xff0c;进行ipv6网段的互通 查询路由表后&#xff0c;​进行全网段的ping测试&#xff0c;实验目的RTD可以ping通RTA 实验解法 按照图示为路由器配置IPv6地址 …

力扣295. 数据流的中位数

Problem: 295. 数据流的中位数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个大顶堆和小顶堆&#xff1b; 2.当添加的数据小于大顶堆的堆顶元素或者大顶堆为空时&#xff0c;将元素添加到大顶堆&#xff1b;当元素大于大顶堆堆顶元素时添加到小顶堆&#xff1b;同…

easy_signin_ctfshow_2023愚人杯

https://ctf.show/challenges#easy_signin-3967 2023愚人杯信息检索&#xff0c;在请求荷载中发现一个base64 face.pngencode ZmFjZS5wbmc解密结果 flag.pngencode ZmxhZy5wbmc尝试一下 返回内容 Warning: file_get_contents(flag.png): failed to open stream: No such file…

T0策略是什么?有哪些优点和缺点,如何操作T0策略?

T0策略又称日内交易策略&#xff0c;它的持仓时间较短&#xff0c;基于对未来短期股价走势的判断&#xff0c;通过低位买入、高位卖出的方式来获得价差收益&#xff0c;并且买入卖出交易在日内完成。 T0策略分类 按照策略逻辑分类&#xff0c;T0策略可分为融券T0和底仓T0。融…

Android11 InputManagerService启动流程分析

InputManagerService在systemserver进程中被启动 //frameworks\base\services\java\com\android\server\SystemServer.java t.traceBegin("StartInputManagerService"); inputManager new InputManagerService(context);//1 t.traceEnd(); //省略 //注册服务 Servi…

我独自升级崛起在哪下载 我独自升级电脑PC端下载教程分享

将于5月8日在全球舞台闪亮登场的动作角色扮演游戏《我独自升级崛起》&#xff0c;灵感源自同名热门动画与网络漫画&#xff0c;承诺为充满激情的游戏玩家群体带来一场集深度探索与广阔体验于一身的奇幻旅程。该游戏以独特的网络武侠世界观为基底&#xff0c;展现了一位普通人踏…

React + 项目(从基础到实战) -- 第11期

目标 问卷编辑器的开发 设计UI - 拆分布局 水平垂直居中 画布 y方向滚动 自定义问卷组件 后端 返回组件数据 //获取单个问卷信息{url: /api/question/:id,method: get,response: () > {return {errno: 0,data: {id: Random.id(),title: Random.ctitle(),componentList:[//…

纯血鸿蒙APP实战开发——页面间共享组件实例的案例

介绍 本示例提供组件实例在页面间共享的解决方案&#xff1a;通过Stack容器&#xff0c;下层放地图组件&#xff0c;上层放Navigation组件来管理页面&#xff0c;页面可以共享下层的地图组件&#xff0c;页面中需要显示地图的区域设置为透明&#xff0c;并参考触摸交互控制&am…

Linux网络-部署YUM仓库及NFS共享服务

目录 一.YUM仓库服务 1.YUM概述 1.1.YUM&#xff08;Yellow dog Updater Modified&#xff09; 2.准备安装源 2.1.软件仓库的提供方式 2.2.RPM软件包的来源 2.3.构建CentOS 7 软件仓库 2.4.在软件仓库中加入非官方RPM包组 3.一键安装软件包的工具&#xff1a; 好处&a…

ubuntu中的docker记录(3)——如何安装nvidia-docker以更好地支持GPU加速计算应用程序的运行

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nvidia-docker2的安装1. 安装docker2. 安装nvidia-docker2(1) 添加密钥(2) 更新软件列表(3) 安装nvidia-docker2(4) 测试nvidia-docker2 二、可能的报错及解…

大模型争霸的下一站:不仅是超越GPT-4,更是寻求模型之间的平衡应用

文 | 智能相对论 作者 | 沈浪 知名科学杂志《Nature》发表了一篇关于大模型规模参数大小争议的文章《In Al, is bigger always better?》——AI大模型&#xff0c;越大越好吗&#xff1f;随着大模型应用走向实践&#xff0c;这一问题不可避免地成为了当前AI行业发展的焦点与…

【网络原理】IP协议详解

一.与IP协议相关的基本概念 IP协议&#xff0c;即网际互连协议&#xff08;Internet Protocol&#xff09;&#xff0c;是TCP/IP体系中的核心网络层协议。 网络层IP协议解决的问题 数据传输的过程中,不是直接进行的传输,而是经过层层的封装和分用的过程才能到达对端. IP协议主…

怎么通过网页查看iPhone手机的备忘录内容?

在这个数字化的时代&#xff0c;iPhone已成为我们日常生活中不可或缺的一部分。我特别喜欢用iPhone的备忘录功能&#xff0c;随时随地记录生活的点点滴滴&#xff0c;工作中的待办事项。然而&#xff0c;有时候&#xff0c;当我需要在电脑上查看或编辑这些备忘录时&#xff0c;…

最原理的一集——Mathtype公式编号设置(Mathtype7.8+Word)

版本 Mathtype7.8Office2019 Word 读完本文你将会 随心所欲&#xff0c;想怎么给公式编号就怎么给公式编号&#xff0c;想从(X.1)开始&#xff0c;就从(X.1)开始大概了解Mathtype公式设置原理给作者点赞 如果你想自己跟着文章做的话 请不要在自己的论文里边直接操作&#…

超详细——集成学习——Adaboost——笔记

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…

批量剪辑利器:视频随机分割,创意无限,高效剪辑视频

在视频制作和编辑的过程中&#xff0c;剪辑是一项至关重要的技术。对于需要处理大量视频素材的用户来说&#xff0c;批量剪辑不仅能提高工作效率&#xff0c;还能为视频内容带来创意和多样性。随着技术的发展&#xff0c;一些高效的剪辑工具逐渐崭露头角&#xff0c;其中视频随…

产品推荐 | 基于 Virtex UltraScale+ XCVU3P的FACE-VPXSSD-3PA 存储板

01 产品概述 FACE&#xff08;FPGA Algorithm aCceleration Engine&#xff09;FPGA算法加速开发引擎是基于FPGA可编程器件构建的一系列算法加速开发引擎平台。FACE-VPXSSD-3PA存储平台是FACE系列中的一员。该平台板载2组2GB 64bit DDR4、2路QSFP28光接口、4个NVME SSD M.2接口…

Linux:进程信号(一)信号的产生

目录 一、信号是什么&#xff1f; 二、Linux信号 三、信号处理方式 四、信号的产生 1、 通过终端按键产生信号 2、调用系统函数向进程发信号 3、 硬件异常产生信号 一、信号是什么&#xff1f; 在生活中&#xff0c;有许多信号&#xff0c;比如红绿灯&#xff0c;下课铃声…

达梦主从数据库实例恢复

测试环境&#xff1a;实时主备数据库 1、在节点1向测试表aaa插入数据 如图可见&#xff0c;会话139695153554808向aaa表插入了10000行数据。事务id460520。 2、提交前在另一个窗口kill掉dmserver进程。 3、查看节点2的数据库日志 上图可见&#xff0c;系统执行alter database…

Java基础教程 - 4 流程控制

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 4 流程控制 4.1 分支结构…