当前位置: 首页 > news >正文

数字黑洞:揭秘6174的神奇数学现象

好的,我们来解决 GESP 2023年9月认证 C++ 二级编程题中的 "数字黑洞" 问题。

问题描述:"数字黑洞" 指的是一个数学现象:对于任意一个四位数(各位数字不完全相同),按照以下步骤操作,最终都会得到6174:

  1. 将数字的四个数字组成一个最大的四位数
  2. 将数字的四个数字组成一个最小的四位数(首位可以为0)。
  3. 求出最大数与最小数的
  4. 用这个差替换原来的数字。
  5. 重复上述步骤,直到得到的差为6174为止。

现在,你需要编写一个程序,输入一个四位数n(保证n的各位数字不全相同),输出每一步得到的最大数、最小数以及它们的差,直到差为6174为止。输出的每一步应包含该步的序号(从1开始)。

输入样例:

1000

输出样例:

1: 1000 - 0001 = 999 2: 9990 - 0999 = 8991 3: 9981 - 1899 = 8082 4: 8820 - 0288 = 8532 5: 8532 - 2358 = 6174

解题思路:

  1. 验证输入:确保输入是一个有效的四位数,并且各位数字不全相同(题目已保证)。
  2. 循环处理:使用一个循环(如whiledo-while),当当前数字不是6174时继续处理。
  3. 提取数字:将当前数字分解成它的四个数字(千位、百位、十位、个位)。例如,对于1000,数字是1,0,0,0
  4. 排序:将这四个数字:
    • 降序排列得到最大数(如1, 0, 0, 0->1000)。
    • 升序排列得到最小数(如1, 0, 0, 0->00011)。
  5. 计算差值:计算最大数与最小数的差。
  6. 输出步骤:按照要求的格式输出当前步骤号、最大数、最小数、差值。
  7. 更新数字:将差值作为新的数字,进行下一轮处理。
  8. 终止条件:当差值为6174时,停止循环。

注意事项:

  • 补零:在组成最小数时,如果升序后首位是0,结果就是小于1000的数(如0001就是1)。在计算差值和输出时,需要正确处理这种情况(通常是输出时补足四位)。
  • 步骤计数:需要一个计数器,从1开始,每执行一步就增加1。

C++ 代码实现:

#include <iostream> #include <vector> #include <algorithm> #include <iomanip> // 用于格式化输出 using namespace std; int main() { int n; cin >> n; int step = 1; // 步骤计数器,从1开始 int current = n; // 当前处理的数字 // 当当前数字不是6174时,继续循环 while (current != 6174) { // 1. 分解数字 vector<int> digits; int temp = current; // 确保处理四位数字,不足四位时前面补0(通过循环4次实现) for (int i = 0; i < 4; i++) { digits.push_back(temp % 10); // 取个位 temp /= 10; // 去掉个位 } // 2. 排序以得到最大数和最小数 vector<int> digits_desc = digits; // 降序排列用于最大数 sort(digits_desc.begin(), digits_desc.end(), greater<int>()); // 降序排序 vector<int> digits_asc = digits; // 升序排列用于最小数 sort(digits_asc.begin(), digits_asc.end()); // 升序排序 // 3. 组合成整数 int max_num = 0, min_num = 0; for (int i = 0; i < 4; i++) { max_num = max_num * 10 + digits_desc[i]; // 计算最大数 min_num = min_num * 10 + digits_asc[i]; // 计算最小数 } // 4. 计算差值 int diff = max_num - min_num; current = diff; // 更新当前数字为差值,用于下一轮 // 5. 输出当前步骤 cout << step << ": "; // 输出最大数(确保四位显示,不足补0) cout << setfill('0') << setw(4) << max_num << " - "; // 输出最小数(确保四位显示,不足补0) cout << setfill('0') << setw(4) << min_num << " = "; // 输出差值(确保四位显示,不足补0) cout << setfill('0') << setw(4) << diff << endl; step++; // 步骤计数器增加 } return 0; }

代码说明:

  1. 输入:cin >> n;读入起始的四位数。
  2. 初始化:step记录步骤,current记录当前要处理的数字。
  3. 循环条件:while (current != 6174)确保在得到6174时停止。
  4. 分解数字:
    • 创建一个向量digits存放四个数字。
    • 使用for循环4次,每次取current的个位数 (temp % 10),然后除以10去掉个位 (temp /= 10)。
    • 这样循环4次后,digits中按顺序存放了个位、十位、百位、千位(顺序是反的,但排序后会纠正)。
  5. 排序与组合:
    • 创建两个向量digits_descdigits_asc,分别复制digits的内容。
    • digits_desc进行降序排序 (sort(... greater<int>())。
    • digits_asc进行升序排序 (sort(...)默认升序)。
    • 分别遍历这两个排序后的向量,将数字组合成整数max_nummin_num
  6. 计算差值:diff = max_num - min_num;,并将current更新为diff
  7. 格式化输出:
    • 使用setfill('0')setw(4)确保max_nummin_numdiff在输出时都显示为四位数字,不足四位的前面补0。
    • 按照步骤号: 最大数 - 最小数 = 差值的格式输出。
  8. 步骤递增:step++为下一步做准备。

这个程序严格遵循了 "数字黑洞" 的操作步骤,并按照题目要求的格式输出每一步的结果。

http://www.jsqmd.com/news/669802/

相关文章:

  • 手把手实战:用阿里云ECS从零搭建一套可用的VOS测试环境(含SIP线路对接调试)
  • 一键体验GPT-SoVITS:Docker部署+语音合成实战教程
  • 【2026奇点大会权威解码】:AGI如何重构全球能源管理范式?3大颠覆性技术路径首次公开
  • 模块解耦的重要性
  • DDColor镜像灰度发布:A/B测试不同模型版本着色效果的实施方案
  • BGE-Large-Zh效果展示:天气预报查询与气象文档匹配的语义精准度验证
  • Qwen3-0.6B-FP8实战教程:API接口测试与LLM应用框架无缝对接
  • Windows11安装VC++6.0中文版全攻略
  • SITS2026到底测什么?3大认知维度、7类推理任务、12项泛化指标全拆解:AGI开发者不可错过的准入标尺
  • 基于java的叙事之眼系统自动化测试
  • Spring with AI (): 评估答案——UnitTest引入
  • MySQL中如何使用UPPER转大写字母_MySQL文本格式化函数
  • RMBG-2.0功能体验:蒙版查看、一键下载,完整操作流程
  • LeetCode 594题‘磁带利用率’详解:从背包DP到贪心交换,附C++完整代码与三大易错点
  • 5分钟部署Qwen2.5-VL-7B视觉模型:Ollama让多模态AI触手可及
  • 用了5款降AI率工具后,到底哪个好?真实排名告诉你
  • Fish Speech 1.5语音合成AB测试:不同temperature下自然度主观评分对比
  • 忍者像素绘卷入门必看:5分钟完成Python环境安装与首次调用
  • 第32篇:AI数据标注——隐藏在巨头身后的百亿级市场与入门指南(概念入门)
  • Qwen3-VL-2B与HuggingFace模型对比:本地部署体验差异
  • 降AI率工具哪个好用?看完这篇手把手教你3步选对
  • 零代码体验NaViL-9B:上传图片自动问答,多模态AI快速上手
  • 避坑指南:STM32CubeMX配置FMC驱动LCD时常见的5个低级错误(附ILI9488调试记录)
  • Vision Transformer (ViT) 技术解析
  • 关于explorer.exe报错,及原因
  • YOLO12问题解决:常见报错处理,服务重启与参数调整指南
  • 基于springboot的性格测试系统
  • 下载命令参数或标志(-e等)
  • 告别VSCode!用Vim + NERDTree + cscope打造Linux内核开发者的专属IDE
  • C++哈希扩展:位图与布隆过滤器实战