噫吁汐 2024-02-08 18:14 采纳率: 95%
浏览 2
已结题

UVa-455周期串算法,输出错误

题目如下:

img

我的输入:

2

HoHoHo

abcabcabcabc

代码如下:

#include<stdio.h>
#include<string.h>
#define max 100
int main(){
    int n=0;
//    freopen("input.txt","r",stdin);
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        char s[max];
        char temp[max];
        int label=0;//用于判断结束循环的标志 
        scanf("%s",s);
        for(int j=1;j<=strlen(s);j++){//暴力遍历求最短串 && j代表最短串的位数 
            temp[j-1]=s[j-1];
            int l=0;
            for(int k=0;k<strlen(s);k++,l=(l+1)%j){
                if(temp[l]!=s[k]){//不同就退出判断循环 
                    break;
                }
                if(k==strlen(s)-1){//找到最短串 
                    label=1;
                }
            }
            if(label==1){
                break;
            }
            
        }
        for(int i=0;i<strlen(temp);i++){
            printf("%c",temp[i]);
        }
        printf("%d\n",strlen(temp));
    }
    
} 

输出为:
Ho@3
abc3

第二个案例输出是正确的,但是第一个案例不知道为什么凭空出现了一个@,麻烦大家帮我看一下,提前祝大家新年快乐

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-08 18:15
    关注

    引自免费微信小程序:皆我百晓生

    您在UVa-455周期串问题的代码中处理输出时,遇到了一个错误。问题在于代码没有正确地处理每个测试用例输出之间的换行符,并且在某些情况下可能输出了未初始化的字符。

    针对您的问题,我分析了代码并找到了产生错误输出的原因:

    1. 输出格式错误:当找到最短循环子串后,在输出子串及其长度之前,没有添加换行符来区分不同测试用例的输出。
    2. 未初始化变量导致的乱码temp数组中的部分元素没有被初始化,在某些情况下可能会输出这些未定义的值,表现为“@”或其他不可预见的字符。

    为了修正这个问题,请修改代码如下:

    #include<stdio.h>
    #include<string.h>
    
    #define max 100
    
    int main(){
        int n;
        scanf("%d",&n);
        
        for(int i = 0; i < n; i++) {
            char s[max];
            scanf("%s", s);
    
            // 初始化temp数组
            memset(temp, 0, max);
    
            int label = 0;
            int min_len = strlen(s); // 初始化为最长可能的循环串长度
            
            for(int j = 1; j <= min_len; j++) {
                int l = 0;
                for(int k = 0; k < strlen(s); k++, l = (l + 1) % j){
                    if(temp[l] != s[k]){
                        break;
                    }
                    if(k == strlen(s) - 1 && l == 0){ // 找到最短循环串,同时确保循环完整结束
                        label = 1;
                        min_len = j; // 更新最短循环串长度
                        break;
                    }
                }
                if(label == 1) {
                    break;
                }
            }
            
            // 输出最短循环子串
            for(int i = 0; i < min_len; i++){
                printf("%c", temp[i]);
            }
            printf("%d\n", min_len); // 输出长度后记得加换行符
            
            // 在每个测试用例之间添加换行符
            if(i < n - 1) {
                printf("\n");
            }
        }
        
        return 0;
    }
    

    请注意,我还优化了代码逻辑以确保在找到符合条件的最短循环子串后,更新其长度。另外,我确保了每个测试用例输出后都添加了一个换行符。这样应该能解决您的问题,并得到正确的输出结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月16日
  • 已采纳回答 2月8日
  • 创建了问题 2月8日

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证