Почему я получил неправильный ответ по этой проблеме (Uva OJ 455) - PullRequest
0 голосов
/ 19 мая 2019

Я без ума от этой проблемы (Uva 455):

Считается, что строка символов имеет период k , если она может быть сформирована конкатенация одного или нескольких повторов другой строки длиной k . Например, строка «abcabcabcabc» имеет период 3, так как формируется из 4 повторений строки ”abc”. Также есть периоды 6 (два повторения «abcabc») и 12 (одно повторение «abcabcabcabc»).

Напишите программу для чтения строки символов и определить его наименьший период.

Input

Первая строка входного файла будет содержать одно целое число N , указывающее, сколько тестовых примеров ваша программа будет проверена с пустой строкой. Каждый тест будет содержать одну строку символов до 80 непустых символов. Два последовательных ввода будут разделены пустой строкой.

выход

целое число, обозначающее наименьший период входной строки для каждого вход. Два последовательных вывода разделены пустой строкой.

Пример ввода

1

HoHoHo

Пример вывода

2

Я проверил все тестовые случаи, которые только мог себе представить, и все они дали верный результат, но я все равно получаю неправильный ответ в онлайн-судье. Где я неправ? (Английский не является моим родным языком; прошу прощения за ошибки при вводе или синтаксис.)

#include <stdio.h>
#include <string.h>
#define maxn 85

int check(char* s, int per){
    for(int i = 0; i < strlen(s) - per; i++){
        if(s[i + per] != s[i])  return 0;
    }
    return 1;
}

int main(){
    int T;
    scanf("%d", &T);
    char s[maxn];
    while(T--){
        scanf("%s", s);
        int len = strlen(s);
        bool OK = false;
    for(int i = 1; i <= len/2 && (len % i == 0); i++){//That's wrong.
        if(check(s, i)){
            printf("%d\n", i);
        OK = true;
        break;
        }
    }
        if(!OK) printf("%d\n", len);
        if(T)   printf("\n");
    }
    return 0;
}

1 Ответ

0 голосов
/ 19 мая 2019

Проблема в for(int i = 1; i <= len/2 && (len % i == 0); i++).Вы останавливаетесь, как только вы сталкиваетесь с i, который не делит len, вместо того, чтобы пропустить его.

Запишите цикл как:

for (int i = 1; i <= len/2; i++) {
    if (len % i != 0) continue;

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...