solution-p1532

题解 P1532 【卡布列克圆舞曲 】

原题

一道较难搞的模拟

因为蒟蒻不会奇奇怪怪的STL

所以都是手打的

思路

一个数组b存储操作过程中的数

每次扫一遍判断是否开始循环

如果循环:

记录循环开始的位置k

从k开始到总操作次数len - 1(第len个循环了)输出b[i]

否则:

len++,记录当前数用于下一次判断循环。

代码

// 此处应有头文件
int a[105]; // 将数倒入数组方便处理 
long long b[100005]; // 存储过程
bool cmp(int a,int b)
{
    return a > b;
}
long long max_(long long n)
{
    memset( a , 0 , sizeof(a) );
    a[0] = 1; // a[0] 存储位数 
    while(n) // 将数转换为数组 
    {
        a[ a[0] ] = n % 10;
        n /= 10;
        a[0]++;
    }
    a[0]--;
    sort(a + 1 , a + a[0] + 1 , cmp); // 从大到小排序 
    long long k = a[1];
    for(int j = 2;j <= a[0];j++)
        k = k * 10 + a[j];
    return k;
}
long long min_()
{
	// max_ 函数已经将a数组从大到小排序
	// min_ 函数反过来算即可 
    long long k = a[ a[0] ];
    for(int j = a[0] - 1;j >= 1;j--)
        k = k * 10 + a[j];
    return k;
}
int main()
{
    long long n;
    while(cin >> n)
    {
        int len = 0; // 总操作次数
        int k; // 循环节起点
        bool flag = true; 
        b[len++] = n;
        while(flag)
        {
            b[len] = max_(b[len - 1]) - min_();
            
            // max_ : n重新排列后最大
            // min_ : -----------最小 
			
            n = b[len]; // 用于判断循环 
            for(int i = 0;i < len;i++)
            {
                if(b[i] == n) // 是否循环
                {
                    flag = false;
                    k = i;
                    break ;
                }
            }
			len++;
        }
        for(int i = k;i < len - 1;i++) // 从循环起点 k 到 len - 1
            cout << b[i] << " ";
        cout << endl;
    }
    return 0;
}
posted @   iorit  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示