LuoguP1898 缘分计算 题解

Content

根据一个长度为 \(l\),只含大写字母的字符串算出它的“缘分值”。

步骤如下:

  1. 给定一个数 \(st\)
  2. 将字符串里面的所有字母改成数字(如 A 改成 \(st\),B 改成 \(st+1\),……,Z 改成 \(st+25\)),并拼接成一个数字。
  3. 将这个数字中相邻数位的两个数相加并依次写下它的个位数,重新拼接出新的数字。
  4. 对这个新的数字重复操作 \(3\),直到这个数字 \(\leqslant 100\) 为止,此时这个数字即为需要操作的字符串的“缘分值”。

数据范围:\(4\leqslant l\leqslant 10,1\leqslant ST\leqslant 10000\)

Solution

这道题目是一道很简单的模拟,如果对题意不懂的建议先去题面中的解释看看,再来看题解。

就只需要将所有的字符根据 \(st\) 转化为数字,然后一个一个拼接,最后再模拟一下整合的过程就好了。完全就是按照题目中所说的模拟一遍就好了。

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;

string s;
int t, sum[17], digits[1000007], cnt;

int main() {
	cin >> s >> t;
	int n = s.size(), sumtot = 0;
	for(int i = 0; i < n; ++i) {
		sum[i] = t + (s[i] - 'A'); 
		int tmp[17] = {0};
		while(sum[i]) {
			tmp[++tmp[0]] = sum[i] % 10;
			sum[i] /= 10;
		}
		for(int i = tmp[0]; i >= 1; --i)
			digits[++cnt] = tmp[i];
	}
	while(cnt >= 3) {
		if(cnt == 3) {
			for(int i = 1; i <= 3; ++i)
				sumtot = sumtot * 10 + digits[i];
			if(sumtot == 100)	break;
		}
		for(int i = 1; i < cnt; ++i) {
			digits[i] = (digits[i] + digits[i + 1]) % 10;
//			printf("%d", digits[i]);
		}
//		puts("");
		cnt--;
	}
	if(sumtot == 100)	printf("%d", sumtot);
	else {
		sumtot = 0;
		for(int i = 1; i <= cnt; ++i)
			sumtot = sumtot * 10 + digits[i];
		printf("%d", sumtot);
	}
	return 0;
}
posted @ 2021-12-21 21:04  Eason_AC  阅读(59)  评论(0)    收藏  举报