Поиск всех палиндромов в массиве int C - PullRequest
2 голосов
/ 18 апреля 2020

Это может показаться длинным, но я перебил это.

Так что у меня проблема не в том, чтобы найти палиндромы, это просто в поиске длины палиндрома, которую я не могу понять и мой код не работает для одиночных ди git палиндромов (да, мы их тоже считаем) так вот код и объяснение:

#include <stdio.h>

#define LEN 9

int *lastEqual(int *p, int *q) {
    int *rightmost;
    int *temp;
    int *zero = p;

    while (p <= q) {
        if (*zero == *(p + 1)) {
            temp = p + 1;

            if (temp < q) {
                rightmost = temp;
            }
        }
        p++;                
    }
    return rightmost;
}

Что эта функция делает или предполагает делать :

* Для данного массива: { 3 , 6,7,8,7,6,5, 3 , 5 } Если lastEqual вызывается ссылками жирных чисел, он возвращает указатель на 3. (ближайший к концу массива) *

* Для данного массива: {3, 6 , 7,8,7, 6 , 5,3, 5 } Если lastEqual вызывается ссылками на полужирные числа, он возвращает указатель на 6. *

Вот вторая функция:

int isPalindromic(int *p, int *q) {
    int *left = p;
    int *right = q;
    int pali;

    while (left < right) {
        if (*left == *right) {
            pali = 1;
        } else {
            pali = 0;
        }
        left++;
        right--;
    }
    return pali;
}

Вот что она делает или должна делать:

Для данного массива: { 3 , 6,7,8,7,6,5, 3 , 5} If isPalindromi c вызывается ссылками на полужирные числа, которые он возвращает 0, так как числа между этими адресами не представляют палиндром.

Для данного массива: {3, 6 , 7,8,7, 6 , 5,3,5} Если isPalindromi c вызывается ссылками на полужирные числа, возвращается 1, поскольку числа между этими адресами представляют палиндром .

А вот основная функция:

int main() {
    int *p, *q, *rightmost;
    int arr[LEN] = { 3, 6, 7, 8, 7, 6, 5, 3, 5 };
    p = arr;
    q = p + (LEN - 1);

    for (int i = 0; i < LEN; i++) {
        if (isPalindromic(p + i, lastEqual(p + i, q)) == 1) {
            rightmost = lastEqual(p + i, q);
            printf("Palindrome at index %d, length %ld\n", i, &p - &rightmost);
        }
    }
    return 0;
}

И вывод должен быть таким, но я не могу понять, как найти длину и почему она не учитывает одно git число в виде палиндрома, например, 8:

{3,6,7,8,7,6,5,3,5}, поэтому 3 к 3 не является палиндромом, от 6 до 6 - от 7 до 7, и также следует считать 8, потому что нет пары 8

Выходные данные должны быть такими:

Input Array: {1}
Output: “palindrome at index 0, length: 1”
Input Array: {5, 6, 7, 8, 7, 6, 5, 2, 5}
Output: “palindrome at index 0, length: 7”
Input Array: {2, 7, 6, 11, 10, 11, 6, 5, 3}
Output: “palindrome at index 2, length: 5”
Input Array: {7, 8, 9, 8, 7}
Output: “palindrome at index 0, length: 5”
Input Array: {2, 7, 4, 3, 2, 6, 1, 2, 1}
Output: “palindrome at index 6, length: 3”

1 Ответ

2 голосов
/ 19 апреля 2020

Вот более простая версия isPalindromic с теми же аргументами и гораздо более простая версия main() для поиска всех палиндромов:

#include <stdio.h>

int isPalindromic(int *p, int *q) {
    while (p < q) {
        if (*p++ != *q--)
            return 0;
    }
    return 1;
}

int main() {
    int arr[] = { 3, 6, 7, 8, 7, 6, 5, 3, 5 };
    int len = sizeof(arr) / sizeof(arr[0]);

    for (int i = 0; i < len; i++) {
        for (int j = i; j < len; j++) {
            if (isPalindromic(arr + i, arr + j))
                printf("Palindrome at index %d, length %d\n", i, j - i + 1);
        }
    }
    return 0;
}

Если вы просто хотите вывести самый длинный палиндром, измените функцию main на это:

int main() {
    int arr[] = { 3, 6, 7, 8, 7, 6, 5, 3, 5 };
    int len = sizeof(arr) / sizeof(arr[0]);
    int max_pos = 0, max_len = 1;

    for (int i = 0; i < len; i++) {
        for (int j = i + max_len; j < len; j++) {
            if (isPalindromic(arr + i, arr + j)) {
                max_pos = i;
                max_len = j - i + 1;
            }
        }
    }
    printf("Longest palindrome at index %d, length %d\n", max_pos, max_len);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...