PAT乙级.1003.我要通过
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT乙级.1003.我要通过相关的知识,希望对你有一定的参考价值。
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA输出样例:
YES YES YES YES NO NO NO NO
题意分析:
1)空字符串 不是 空格键 的意思。
2)根据1知
字符串中有且仅有‘P’‘A’‘T’三个字符。
3)根据2,3和输入样例可知:
输入必须包含一个P和一个T;
P和T的位置关系不能颠倒;
P之前A的个数 × P、T之间A的个数 ≡ T之后的A的个数。
#include <stdio.h> //此代码运行正确 #include<string.h> char str[1000]; int main() { int i, n; scanf_s("%d", &n); while (n--) { int num, temp, aunt, p, t; //此处变量为局部变量,写在全局变量处会导致程序出错 num = 0; temp = 0; aunt = 0; p = 0; t = 0; scanf_s("%s", str, 100); //scanf_s为vs2017中用法,提交时将scanf_s改成scanf即可(将100删掉) for (i = 0; i <strlen(str); i++) { if (str[i] == ‘P‘) { p = i; //p所在位置 从1开始计数 num++; } if (str[i] == ‘T‘) { t = i; //t所在位置 从1开始计数 temp++; } if (str[i] == ‘A‘) { aunt++; //A的总个数 } } if ((num + temp + aunt)!= strlen(str) || num > 1 || temp >1 || p*(t - p - 1) != strlen(str) - t-1||t-p<=1) { printf("NO\n"); } else { printf("YES\n"); } } }
下面这个程序因为局部变量定义位置出错导致程序出错。
#include <stdio.h> //运行出错 #include<string.h> char str[1000]; int main() { int i, n; int num, temp, aunt, p, t; //此处变量为局部变量,写在全局变量处导致程序出错 num = 0; temp = 0; aunt = 0; // p = 0; t = 0; scanf_s("%d", &n); while (n--) { scanf_s("%s", str, 100); for (i = 0; i <strlen(str); i++) { if (str[i] == ‘P‘) { p = i; //p所在位置从0开始计数 num++; } if (str[i] == ‘T‘) { t = i; //t所在位置 从0开始计数 temp++; } if (str[i] == ‘A‘) { aunt++; //A的总个数 } } if ((num + temp + aunt)!= strlen(str) || num > 1 || temp >1 || p*(t - p - 1) != strlen(str) - t-1||t-p<=1) { printf("NO\n"); } else { printf("YES\n"); } } }
以上是关于PAT乙级.1003.我要通过的主要内容,如果未能解决你的问题,请参考以下文章