本文共 1805 字,大约阅读时间需要 6 分钟。
ZOJ Problem Set - 3490 String Successor(字符串模拟)
这是一道比赛题,我们队里有小伙伴参加。他一开始对题意理解得不太透彻,花了半小时才大概明白意思。可以说他的理解能力还有提升的空间。
后来他自己开始思考代码,虽然尝试了一段时间,但因为思路不够清晰,最后没能顺利完成,选择放弃。看到其他队友都解决了这道题,他感到有些嫉妒,意识到自己的代码能力还有待提高。
比赛结束后,他重新回到代码,继续努力解决这个问题。经过一段时间的琢磨,他终于完成了代码提交。然而,由于匆忙,忘记了案例中的特殊处理,导致第一次提交失败。幸运的是,第二次提交时终于通过了,看到Accepted的结果让他感到无比欣喜。
这次经历让他明白,编程不仅需要扎实的技术功底,更需要细心和耐心。以后遇到问题时,不要再轻易放弃,要勇于多次尝试,直到找到最优的解决方案。
题目大意:
这道题有两种主要情况:第一种情况是字符串中包含数字和字母。我们需要忽略所有非数字字母,只关注数字字母。每次将最后一个数字字母加一,当进位发生时,需要处理。具体来说,当遇到非字母字符时,需要像案例2那样处理进位。如果后面没有数字字符,就像案例2那样产生进位。第二种情况是字符串中全是非数字字母。这种情况下,最后一位会加一,直到出现数字字符为止,此时会进入第一种处理方式。
AC代码:
#include#include #include #include #include #include using namespace std;char a[101];int n;int add(int point1) { int pan = 0; point1++; int len = point1; while (point1) { point1--; if (isalnum(a[point1])) { pan = 0; a[point1]++; if (a[point1] == 'z' + 1) { a[point1] = 'a'; pan = 1; } else if (a[point1] == 'Z' + 1) { a[point1] = 'A'; pan = 1; } else if (a[point1] == '9' + 1) { a[point1] = '0'; pan = 1; } if (pan == 0) break; } } if (pan) { int flag = 0; char cmp1, cmp2; for (int i = 0; i <= len - 1; i++) { if (isalnum(a[i]) && flag == 0) { cmp1 = a[i]; if (a[i] == '0') a[i] = '1'; flag = 1; } if (flag) { cmp2 = a[i + 1]; a[i + 1] = cmp1; cmp1 = cmp2; } } a[len + 1] = '\0'; }}int main() { int t; scanf("%d", &t); while (t--) { memset(a, 0, sizeof(a)); scanf("%s", a); scanf("%d", &n); int len = strlen(a); int pan = 1; for (int i = 0; i < len; i++) { if (isalnum(a[i])) { if (a[i] == '9') { a[i] = '0'; pan = 1; } else if (a[i] < '9') { a[i]++; pan = 0; } } } if (pan) { int flag = 0; char cmp1; for (int i = 0; i < len; i++) { if (isalnum(a[i])) { cmp1 = a[i]; if (a[i] == '0') a[i] = '1'; flag = 1; } if (flag) { a[i + 1] = cmp1; } } a[len] = '\0'; } }}
转载地址:http://cwaoz.baihongyu.com/