【问题标题】:Finding all the Palindromes in int array C查找 int 数组 C 中的所有回文
【发布时间】:2020-04-18 20:28:19
【问题描述】:

可能看起来很长,但我解释过头了。

所以我的问题不一定是找到回文它只是 找到回文的长度我无法弄清楚而且我的代码不适用于一位数回文(是的,我们也计算它们) 所以这里是代码和解释:

#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} 如果 isPalindromic 由参考文献 它返回 0 的粗体数字,因为这些地址之间的数字不 表示回文。

对于给定的数组:{3,6,7,8,7,6,5,3,5} 如果 isPalindromic 被参考文献 它返回 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;
}

输出应该是这样的,但我不知道如何找到长度以及为什么它不将单个数字视为像这样的回文 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”

【问题讨论】:

  • 是时候和鸭子说话了...见How to debug small programs
  • 这里似乎没有太多的开始。我建议先让isPalindromic 工作,然后暂时忘记其他功能。甚至可能将其从帖子中删除。 isPalindromic 是一个非常简单的函数,您应该能够轻松编写和调试它。一旦它工作稳定,然后解决lastEqual
  • isPalindromic 在我实际测试时可以工作,但是当我在主程序中调用它时,它会跳过 8,否则这两个函数都可以正常工作 ı blieve

标签: c arrays pointers palindrome


【解决方案1】:

这是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;
}

【讨论】:

  • 我试过了,当我用你的回文函数尝试它时它给了我错误的输出
  • 但是当我只用 main 和我的函数尝试它时,它有点工作,但第一个输出是这个 Palindrome at index 0, length 7 这不应该存在,因为在 3 之间有 5 个破坏回文
  • @AliUlaşHayır:对此感到抱歉。我用isPalindromemain 中的修复更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2021-11-04
  • 2014-03-31
相关资源
最近更新 更多