题解 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;
}
标签:p1532,int,solution,long,++,flag,循环,len
From: https://www.cnblogs.com/iorit/p/18056993