1 solutions

  • 0
    @ 2025-11-5 20:15:04

    C++ :

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    #define N 10000
    
    long long GetMax(const long long& num, const int& k);
    long long GetMin(const long long& num, const int& k);
    int AscComp(const char& a, const char& b);
    int DesComp(const char& a, const char& b);
    
    int main()
    {
    	long long szRes[N] = {0L};
    	int n = 0;
    	while (cin >>n)
    	{
    		memset(szRes, 0, sizeof(szRes));
    		szRes[0] = n;
    		long long num = (long long)n;
    		int k = log10(num) + 1;
    		long long max = 0L, min = 0L;
    		int pos = 1;
    		int nStart = 0, nEnd = 0;
    		bool bFind = false;
    		while (!bFind)
    		{
    			max = GetMax(num, k);
    			min = GetMin(num, k);
    			num = max - min;
    			
    			for (int i = 0; i < pos; ++i)
    			{
    				if (num == szRes[i])
    				{
    					nStart = i;
    					nEnd = pos - 1;
    					bFind = true;
    					break;
    				}
    			}
    			szRes[pos++] = num;
    		}
    		
    		cout <<szRes[nStart];
    		for (int i = nStart + 1; i <= nEnd; ++i)
    		{
    			cout <<' ' <<szRes[i];
    		}
    		cout <<endl;
    	}
    	return 0;
    }
    
    long long GetMax(const long long& num, const int& k)
    {
    	if (num == 0) return 0;
    	char szNum[12] = "\0";
    	long long nMaxNum = 0;
    	sprintf(szNum, "%lld", num);
    
    	// 补充0
    	int len = strlen(szNum);
    	while (len < k)
    	{
    		szNum[len++] = '0';
    	}
    
    	sort(szNum, szNum + k, DesComp);
    	sscanf(szNum, "%lld", &nMaxNum);
    	return nMaxNum;
    }
    
    long long GetMin(const long long& num, const int& k)
    {
    	if (num == 0) return 0;
    	char szNum[12] = "\0";
    	long long nMinNum = 0;
    	sprintf(szNum, "%lld", num);
    
    	// 补充0
    	int len = strlen(szNum);
    	while (len < k)
    	{
    		szNum[len++] = '0';
    	}
    	sort(szNum, szNum + k, AscComp);
    	// 处理首位是0的情况
    	/*if (szNum[0] == '0')
    	{
    		int i = 1;
    		while (szNum[i] == '0') ++i;
    		szNum[0] = szNum[0] ^ szNum[i];
    		szNum[i] = szNum[0] ^ szNum[i];
    		szNum[0] = szNum[0] ^ szNum[i];
    	}*/
    	sscanf(szNum, "%lld", &nMinNum);
    	return nMinNum;
    }
    
    int AscComp(const char& a, const char& b)
    {
    	return a < b;
    }
    
    int DesComp(const char& a, const char& b)
    {
    	return a > b;
    }
    
    • 1

    Information

    ID
    20182
    Time
    1000ms
    Memory
    64MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By