【题解】CF1157A 题解
CF1157A 题解
思路分析
简单周期模拟题。
首先,题目要求我们求出操作过程中会出现多少个不同的数。那么显然这个操作会有周期。
于是我们开始找周期。由于这个操作只关于被操作数本身,不依赖其他的数,所以只要出现一个前面出现过的数,就算找到周期了。
然后就很简单了,每次变化并记录一个数,出现一个前面出现过的数就停止。最后统计输出即可。
现在唯一的问题就是记录出现过的数。由于数据范围较大,不方便用布尔数组存储。所以考虑使用数据结构 map 来存储。
操作本身很简单,判断是否能被十整除,能整除就一直除,除到不能除为止。
接下来按步骤实现就可以了。
关键代码
map <int, bool> mp; //记录出现过的数的数据结构
int main()
{
int n;
cin >> n;
int cnt = 0; //记录答案
while(mp[n] == false) //如果没出现过访问过的数
{
cnt++;
mp[n] = true; //记录
n++;
while(n % 10 == 0) n /= 10; // 加一后操作
}
cout << cnt << endl;
return 0;
}

浙公网安备 33010602011771号