尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
UVa 640 Selft Numbers
题目描述194919491949年印度数学家D.R. Kaprekar\texttt{D.R. Kaprekar}D.R. Kaprekar发现了一类被称为“自数”self-number\texttt{self-number}self-number的数。对于任意正整数nnn定义d(n)nd(n) nd(n)n加上nnn的各位数字之和。例如d(75)757587d(75) 75 7 5 87d(75)757587。从任意正整数nnn出发可以构造无限递增序列n,d(n),d(d(n)),…n, d(n), d(d(n)), \ldotsn,d(n),d(d(n)),…例如从333333开始得到33,39,51,57,69,…33, 39, 51, 57, 69, \ldots33,39,51,57,69,…。若存在某个nnn使得d(n)md(n) md(n)m则称nnn是mmm的一个生成元。一个数如果没有生成元则称为自数。例如101101101有两个生成元919191和100100100。小于100100100的自数有131313个1,3,5,7,9,20,31,42,53,64,75,86,971, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 971,3,5,7,9,20,31,42,53,64,75,86,97。本题要求输出所有不超过100000010000001000000的正整数自数按升序排列每行一个。输入格式本题没有输入。输出格式输出所有不超过100000010000001000000的自数每行一个整数按升序排列。样例输出1 3 5 7 9 20 31 42 53 64 ... 9903 9914 9925 9927 9938 9949 9960 9971 9982 9993 ...题目分析本题要求找出111到100000010000001000000之间的所有自数。直接对每个数检查是否存在生成元复杂度为O(Mlog⁡M)O(M \log M)O(MlogM)其中M106M 10^6M106完全可以接受。但更常见的做法是采用“筛法”思想从111到MMM遍历若当前数尚未被标记为非自数则它一定是自数输出它然后从它开始不断迭代d(x)d(x)d(x)将生成的所有数标记为非自数直到超过MMM或遇到已标记的数避免重复工作。由于d(x)d(x)d(x)的增长速度至少为111迭代次数有限总时间复杂度O(M)O(M)O(M)非常高效。解题思路使用布尔数组number[1000001]初始全为000表示未标记默认为自数候选。从i1i 1i1到MMM遍历若number[i] 0则iii是自数输出。然后从iii开始反复计算next d(current)并将number[next]标记为111表示非自数直到next M或number[next]已经被标记说明后续数已处理过可提前终止。计算d(x)d(x)d(x)时累加xxx与其各位数字之和。注意虽然M1000000M1000000M1000000不是很大但使用while迭代比直接对每个数检查生成元更快。复杂度分析每个数最多被标记一次每次迭代计算数字和的时间与位数相关最多777位总操作数约为O(M⋅log⁡M)O(M \cdot \log M)O(M⋅logM)但实际接近O(M)O(M)O(M)。空间复杂度O(M)O(M)O(M)。代码实现// Self Numbers// UVa ID: 640// Verdict: Accepted// Submission Date: 2016-08-23// UVa Run Time: 0.020s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intnumber[1000001]{0};intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);number[1]0;for(inti1;i1000000;i){if(number[i]0){couti\n;intstarti;while(start1000000){intnextstart;while(start0){nextstart%10;start/10;}if(next1000000){if(number[next]1)break;number[next]1;startnext;}elsebreak;}}}return0;}总结本题利用筛法思想通过标记所有非自数一次性输出所有自数。关键点在于理解自数的定义以及生成元迭代过程并利用数组标记避免重复计算。由于上限仅为10610^6106算法效率很高。此方法也适用于寻找更大范围内的自数只需调整数组大小即可。该题是典型的“生成元”问题掌握筛法思路对解决类似问题很有帮助。
RELATED

相关推荐

让大模型生成可维护代码:约束式 Prompt 工程的设计与验证

让大模型生成可维护代码:约束式 Prompt 工程的设计与验证

让大模型生成可维护代码:约束式 Prompt 工程的设计与验证 一、代码生成的隐性成本 用 LLM 写代码很快,改起来也很快。生成的代码往往"能跑",但经不起维护。变量名随意、缺少异常处理、逻辑全挤在一个函数里。 这类代码上线后&#…

📅 2026/8/25 8:58:15
深度解析DDS在ROS2核心技术中的关键作用

深度解析DDS在ROS2核心技术中的关键作用

在现代机器人软件开发领域中,ROS2作为机器人操作系统的第二代版本,已成为行业标准。它的核心优势在于通信机制的创新,其中DDS扮演着至关重要的角色。DDS,即数据分发服务,是ROS2能够实现高性能、可靠性和可扩展性的基石。本文将以DDS在ROS2中的作用为唯一焦点,深入探讨其技…

📅 2026/8/25 9:08:33
云原生网络之Cilium的eBPF数据面

云原生网络之Cilium的eBPF数据面

云原生网络之Cilium的eBPF数据面在云原生技术浪潮中,容器网络经历了从简单互联到高性能、高可观测性、高安全性的深刻演变。传统容器网络方案往往依赖于iptables、IPVS等内核子系统,在规模扩展和功能丰富性上逐渐面临瓶颈。而Cilium项目凭借其基于eBPF技…

📅 2026/9/15 14:14:29
MORE NEWS

更多资讯

📰

PLC工程师必读:IEC 61131标准与五种编程语言实战解析

1. 为什么现场工程师都得懂一点IEC 61131标准去年我接手一条老产线的改造项目,让我重新把IEC 61131标准翻了一遍。产线本身没什么大改动,但原控制系统用了大量品牌私有指令、乱成一团的变量命名和一部分只有原工程师自己才看得懂的"祖传逻辑"&…

📰

Mininet三种创建方式:可视化拖拽、命令行速建与交互式调试

简介:本资源为高校计算机网络课程配套的Mininet基础实验报告,面向网络工程、软件定义网络(SDN)初学者及实践教学场景,聚焦轻量级网络仿真平台的核心操作能力培养。报告系统覆盖Miniedit可视化建模、命令行拓扑构建、交…

📰

DNS 劫持检测接口接入教程:domain 参数、请求示例与风险分级解读

排查“域名解析异常”“被运营商插广告”这类问题时,光查一条 DNS 记录不够,需要对比多个解析源的返回结果。DNS 劫持检测接口通过多家公共 DoH 并发查询同一域名并比对结果,给出风险分级。本文从第一次调用讲起。 一、适用场景 解析异常排…

📰

银行卡识别接口接入教程:参数、请求示例与返回字段解读

在线开户、支付绑卡这类流程里,让用户手动输入一长串卡号既慢又容易出错。银行卡识别接口可以从图片中识别卡号与有效期,辅助录入和核对。本文从第一次调用写起:要准备什么、最小请求怎么发、返回值怎么看。 一、适用场景 在线开户&#xf…

📰

企业供应商项目接口接入教程:参数、请求示例与分页返回解读

做企业画像或供应链调研时,经常需要知道一家企业名下有哪些供应商项目关系。企业供应商项目接口就是按企业全称分页查询这类关系。本文从第一次调用写起:要准备什么、最小请求怎么发、返回值怎么看。 一、适用场景 供应链调研:按企业全称拉…

📰

MCP 鉴权凭证生命周期管理:基于短期动态 Token 与细粒度访问控制的隔离实战

在模型上下文协议(Model Context Protocol, MCP)全面打通大模型与企业内网系统(知识库、内部数据库、工作流微服务)的生态中,客户端(如 Claude Desktop、Cursor、企业私有 Agent 宿主)与服务端&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬