m0_61646154 2024-04-23 14:32 采纳率: 83.3%
浏览 4
已结题

pta乙级1003题

请问pta乙级1003题的这部分代码逻辑是哪错了呢,
num_pa是p之前的a的个数)
num_pt是中间的个数
num_aa是t之后a的个数


#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;

int main() {
    int n;
    int num_pa=0,num_pt=0,num_aa=0;
    int p_num=0,t_num=0;
    char str[100];
    int flag=0;
    scanf("%d",&n);
    for(int j=0;j<n;j++){
        scanf("%s",str);
        for (int i = 0; i < strlen(str); i++) {  //遍历
            if(str[i]=='P'){
                p_num++;
                if(p_num>1){
                    flag=1;
                    break;
                }
            }else if(str[i]=='T'){
                t_num++;
                if(t_num>1|| ( p_num== 0)){
                    flag=1;
                    break;
                }
            }else if(str[i]=='A'){
                if(p_num==0){
                    num_pa++;
                }else if(t_num==0){
                    num_pt++;
                }else{
                    num_aa++;
                }
            }else{
                flag=1;
                break;
            }
        }
        if(num_pt*num_pa!=num_aa){
            flag=1;
        }
        if((num_pt == 0)||(p_num!=1)||(t_num!=1)){
           flag=1;
        }
        if(num_pt*num_pa==num_aa){
            puts("YES");
        }

        if(flag==1){
            puts("NO");
        }
        
    }
}

img

  • 写回答

4条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-23 14:33
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 该代码为 pta乙级1003题的一部分代码,请指出该代码逻辑问题所在。 代码如下:
    #include <stdio.h>
    #include <string.h>
    #include <string>
    using namespace std;
    int main() {
        int n;
        int num_pa=0,num_pt=0,num_aa=0;
        int p_num=0,t_num=0;
        char str[100];
        int flag=0;
        scanf("%d",&n);
        for(int j=0;j<n;j++){
            scanf("%s",str);
            for (int i = 0; i < strlen(str); i++) {  //遍历
                if(str[i]=='P'){
                    p_num++;
                    if(p_num>1){
                        flag=1;
                        break;
                    }
                }else if(str[i]=='T'){
                    t_num++;
                    if(t_num>1|| ( p_num==0)){
                        flag=1;
                        break;
                    }
                }else if(str[i]=='A'){
                    if(p_num==0){
                        num_pa++;
                    }else if(t_num==0){
                        num_pt++;
                    }else{
                        num_aa++;
                    }
                }else{
                    flag=1;
                    break;
                }
            }
            if(num_pt*num_pa!=num_aa){
                flag=1;
            }
            if((num_pt == 0)||(p_num!=1)||(t_num!=1)){
                flag=1;
            }
            if(num_pt*num_pa==num_aa){
                puts("YES");
            }
            if(flag==1){
                puts("NO");
            }
        }
        return 0;
    }
    

    回答: 该代码的逻辑问题出现在以下几个地方: 1.对于每一个字符串都要进行初始化计数器 在循环中每次渡入一个字符串后,需要将所有计数器归零(reset),但是代码中每次循环没有进行初始化,导致计数器会受到前一个字符串的影响,从而导致出现错误的输出结果。 解决方案:在每个循环前加上一行

    int num_pa=0,num_pt=0,num_aa=0;
    int p_num=0,t_num=0;
    

    2.如果字符串中有 P ,T 可以直接计数,不需要使用计数器记录 当前代码中使用了计数器记录字符串中出现 P 和 T 的个数,这种方法存在风险,可能导致计数器的值被修改或记录错误。 解决方案:可以直接在循环中对字符串进行计数操作。

    for (int i = 0; i < N; i++) {
        if (str[i]=='P') {
            numP ++;
            p_pos = i; // 记录 P 的位置
        }
        else if (str[i]=='T') {
            numT ++;
            t_pos = i; // 记录 T 的位置
        }
        else if (str[i]!='A') {
            return false;
        }
        else {
            numA ++;
        }
    }
    

    3.在输出 YES 和 NO 时使用 Test 格式 输出的内容需要满足 pta 的 Test 格式要求。 解决方案:在输出时加上类似以下代码的格式: cout << "Case #" << k << ": " << result << endl; 参考代码:

    #include<iostream>
    #include<vector>
    using namespace std;
    bool check(string str) {
        int P=0, T=0;
        int numP=0, numT=0, numA=0;
        int p_pos=-1, t_pos=-1;
        for (int i = 0; i < str.length(); i++) {
            if (str[i]=='P') {
                numP ++;
                p_pos = i; // 记录 P 的位置
            }
            else if (str[i]=='T') {
                numT ++;
                t_pos = i; // 记录 T 的位置
            }
            else if (str[i]!='A') {
                return false;
            }
            else {
                numA ++;
            }
        }
        if (numP!=1 || numT!=1 || numA==0 || (t_pos-p_pos<=1)) {
            return false;
        }
        int leftA = p_pos;
        int rightA = str.length()-t_pos-1;
        int middleA = t_pos-p_pos-1;
        if (leftA*middleA!=rightA) {
            return false;
        }
        return true;
    }
    int main() {
        int n;
        cin >> n;
        vector<string> strs(n);
        for (int i = 0; i < n; i++) {
            string str;
            cin >> str;
            strs[i] = str;
        }
        for (int i = 0; i < n; i++) {
            if (check(strs[i])) {
                cout << "YES\n";
            }
            else {
                cout << "NO\n";
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月3日
  • 已采纳回答 4月25日
  • 修改了问题 4月23日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 手机应用程序安装异常
  • ¥15 grbl的G92修改MPos的问题。
  • ¥15 vue2中,Ant Design Pro s-table中,使用服务端排序怎么做
  • ¥15 阿里巴巴国际站的商品详细页如何做到图文分离
  • ¥15 根据质因子个数求因式个数
  • ¥15 matlab模糊控制隶属函数设计
  • ¥45 C++上传文件到SFTP
  • ¥20 组态王 海康Vision Master
  • ¥15 思科WS-C4503-E核心交机
  • ¥15 批量提取WORD信息到EXCEL