2023 年 09 月 二级真题(2)--数字黑洞

【题目】

给定一个三位数,要求各位不能相同。例如, 352是符合要求的, 112是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。神 奇的是,最终一定会得到495 !

试试看,重新排列352 ,得到的最大数为532 ,最小数为235 ,它们的差是297 ;变换297 ,得到972-279=693 ;变换693,963-369=594 ;变换594 ,954-459=495 。因此, 352经过4次变换得到了495 。

现在,输入的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到495吗?

输入描述:

输入一行,包含一个符合要求的三位数N 。

输出描述:

输出一行,包含一个整数C ,表示经过C 次变换得到495 。

样例输入1

352

样例输出1

4

【解题思路】

本题的核心问题有两个:一是如何拆分三位数;二是如何获得最大值和最小值。由于要经过多次拆分,所以一定会用到循环,但是不知道拆分多少次,所以用while循环更合适。

  1. 拆分三位数

拆分三位数使用通用公式:个位=N%10;十位=N/10%10;百位=N/100%10

  1. 获取最大值和最小值

拆分之后的三位数存入数组中,利用对数组的排序函数sort函数进行排序,再将新的数据重新组合获得新的最大值和最小值。

  1. 获得新的数字N

  2. 统计循环次数

上面三个步骤重复执行,直到N=495,结束循环。输出变换次数。

【代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    //第一步:获得数字N
    int N;
    cin>>N;
    int cnt=0;//统计变换次数
    int a[3];//用数组存储三位数拆分后的每一位,方便排序后求最大值和最小值
    int max,min;//存储重新组合后的最大值和最小值
    //第六步:判断新的数字N是否是495,如果不是则继续进循环拆分
    while(N!=495)//重复执行到重新得到的N=495,变换结束
    {
        //第二步拆分数字N,并对拆分后的三个数进行排序
        //对三位数拆分,存储到数组中
        a[0]=N%10;
        a[1]=N/10%10;
        a[2]=N/100%10;
        sort(a,a+3);//对数组中的三个数由小到大排序
        //第三步:得到最大值和最小值
        max=a[2]*100+a[1]*10+a[0];//得到新的最大值
        min=a[0]*100+a[1]*10+a[2];//得到新的最小值
        //第四步:按照题目要求更新数字N
        N=max-min;//得到新的N
       //第五步:统计拆分次数的变量+1
        cnt++;//拆分次数+1

    }
    //第七步:输出拆分次数。
    cout<<cnt;
    return 0;
}
相关推荐
薛定e的猫咪4 分钟前
【ICML 2025】MODULI:基于扩散模型解锁离线多目标强化学习的偏好泛化
人工智能·学习·算法·机器学习
码农-阿杰5 分钟前
Java 线程中断机制深度解析:从 API 到底层 C++ 实现
java·开发语言·c++
Brilliantwxx6 分钟前
【C++】priority_queue以及 仿函数 的学习
开发语言·c++·笔记·学习·算法
风味蘑菇干7 分钟前
斗地主案例
java·数据结构·算法
宠..15 分钟前
VS Code 修改 C++ 标准同时修改错误检测标准
java·linux·开发语言·javascript·c++·python·qt
洛水水28 分钟前
【力扣100题】39.二叉树的最近公共祖先
算法·leetcode·职场和发展
无敌昊哥战神38 分钟前
【LeetCode 134】加油站:图解指针跳跃与 O(N) 极简贪心,避开 Python 隐藏坑!
c语言·python·算法·leetcode
人道领域42 分钟前
【LeetCode刷题日记】222.极速计算完全二叉树节点数:O(log²n)算法揭秘
java·数据结构·算法·leetcode·深度优先
目黑live +wacyltd1 小时前
算法备案的实操指南(含截图示例)
人工智能·算法·llm·大模型备案·算法备案
小糯米6011 小时前
C语言 指针4
c语言·数据结构·算法