c - 找回文

时间:2018-06-14 05:17:10

标签: c palindrome

我是编程的新手,我选择C作为我的第一语言(已经学习了一个月左右)。 我一直试图解决这个回文问题几个小时,仍然无法提出令人满意的解决方案。 问题是here(来自SPOJ),这是我的代码:

#include <stdio.h>
#include <string.h>
void plus_one(char *number);
int main(void)
{
    char number[1000001];
    int i, j, m, k, indicator;
    int a;
    scanf("%d", &j);
    for (i = 0; i < j; i++) {
        scanf("%s", number);
        k = 1;
        while (k != 0) {
            plus_one(number);
            a = strlen(number);
            indicator = 1;
            for (m = 0; m < a / 2; m++) {
                if (number[m] != number[a - m - 1]) {
                    indicator = 0;
                    break;
                }
            }
            if (indicator != 0) {
                printf("%s\n", number);
                k = 0;
            }
        }
    }
    return 0;
}

void plus_one(char *number)
{
    int a = strlen(number);
    int i;
    number[a - 1]++;
    for (i = a; i >= 0; i--){
        if (number[i - 1] == ':') {
            number[i - 1] = '0';
            number[i - 2]++;
        }
        else
            break;
    }
    if (number[0] == '0') {
        number[0] = '1';
        strcat(number, "0");
    }
    return;
}

我的想法是检查每个大于输入的数字,直到找到回文,并且它在我的计算机上运行良好。但是SPOJ回应了“超出时间限制”,所以我想我需要自己找到下一个回文,而不是使用蛮力。有人可以给我一个提示,告诉我如何让它更快?谢谢!

2 个答案:

答案 0 :(得分:0)

既然你要求提示而不是C代码(我非常擅长),这就是我要做的事情:

  1. 确定数字k是否具有偶数或奇数位数,将其存储在名为odd的布尔值中。
  2. k数字的前半部分,包括odd为真的中间数字,并将其存储在名为half的变量中。
    808 - &gt; 80
    2133 - &gt; 21
  3. 镜像half变量,如果odd为真,请注意不要复制中间数字,并将其存储在名为mirror的变量中。
    80 - &gt; 808
    21 - &gt; 2112
  4. 检查mirror&gt; k
    • 如果为true:您找到了结果
    • 如果为false:递增half并从步骤3开始。
      (最多一次增量后,您可以保证找到结果。)
      80 - &gt; 81 - &gt; 818
      21 - &gt; 22 - &gt; 2222
  5. 这是一个JavaScript实现供您参考:

    const palin = (k) => {
      const mirror = (half, odd) => half + Array.from(half).reverse().join('').substring(odd);
      
      const s = k.toString();
      const odd = s.length % 2;
      const half = s.substring(0, Math.floor(s.length / 2) + odd);
      
      let mirrored = mirror(half, odd);
      
      if (+mirrored <= k) {
        mirrored = mirror((+half + 1).toString(), odd);
      }
      
      return mirrored;
    }
    
    console.log(palin(5));
    console.log(palin(808));
    console.log(palin(2133));

答案 1 :(得分:0)

欢迎访问该网站。你发布的内容对于那些只使用C一个月的人来说是值得称道的!无论如何......我认为你的怀疑是正确的。使用“蛮力”找到下一个回文可能是不可能的。

这个问题和算法设计一样多。尽管如此,你如何处理C中整数的char[]表示是有趣和相关的。 FWIW,我的尝试粘贴在下面。

它接受数字(char[])的n表示和位数(k)作为参数,并在成功或{{1}时返回1失败时(需要另一个传递)。

0

我只用&lt;到目前为止64位数字,但没有理由相信它会因大量数字而失败。

示例用法:http://codepad.org/3yyI9wEl