【题解】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;
}
posted @ 2023-01-11 22:17  邻补角-SSA  阅读(13)  评论(0)    收藏  举报  来源