回文编程

时间:2012-11-30 14:29:13

标签: c++

问题是

回文是在两个方向上读取相同的字符串,例如,赛车,眼睛等。编写程序 提示用户输入字符串并使用递归函数来确定给定输入是否是回文

到目前为止,我已经做到了这一点,但它不是那些工作人员:

#include<stdio.h>
#include<conio.h>
#include<string.h>// to save string

int isPalindrome(char*str);

int main (void)
{
    int result;
    char str[50];

    printf("\n pls enter string; \n");
    gets(str);
    result = isPalindrome(str);

    if(result ==1) 
    {
        printf("\n input string in a palindrome string ");
    }
    else
    {
        printf(" not a palindrome");
    }

    getch();

    return 1;
}

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

   if(str[0]=str[lenght - 1])
   {
       length-=2;
   }

   return isPalindrome(str + 1)
}


{
     return 0;
}

5 个答案:

答案 0 :(得分:7)

由于您将问题标记为C ++,因此这种方法可行:

#include <string>
#include <algorithm>
#include <iostream>

bool isPalindrome(const std::string& str)
{
    // comparison based on 2 string iterators - a "normal" one
    // and a reversed one
    return std::equal(str.rbegin(), str.rend(), str.begin());
}

int main()
{
    std::cout << isPalindrome("racecar") << std::endl; // prints 1
    std::cout << isPalindrome("truck") << std::endl; // prints 0
}

答案 1 :(得分:2)

几乎关于这个功能的一切都被打破了:

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

    if(str[0]=str[lenght - 1])
    {
        length-=2;
    }

    return isPalindrome(str + 1)
}

{
     return 0;
}

我假设你刚做了一个非常粗心的复制和粘贴。基本上,return 0不是函数范围的一部分,因此您的测试永远不会返回0 。因此它会接受所有字符串作为回文。甚至在您的第一个也是最后一个字符测试被错误和不正确的事实之前。

修复最明显的错误:

int isPalindrome(char*str)
{
    static int length = strlen(str);

    if(length<1)
    {
        return 1;
    }

    if(str[0]==str[length - 1])
    {
        length-=2;

        return isPalindrome(str + 1)
    }

    return 0;
}

导致一些代码至少会构建,运行并给出正确的结果。但它不是C ++!

答案 2 :(得分:2)

在Stephan的回答中看到测试函数是如此之小,我们可以使用lambda语法进一步简化它...

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    auto isPalindrome = [](const std::string& str)->bool{return std::equal(str.rbegin(), str.rend(), str.begin());};
    std::cout << isPalindrome("racecar") << std::endl; // prints 1
    std::cout << isPalindrome("truck") << std::endl; // prints 0
}

这将允许你做一些像这样的整洁的东西

#include <string>
#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<std::string> v{"cat", "racecar", "truck", "1991", "eye", "fish"};

    std::cout << "There are " <<
    count_if(v.begin(), v.end(), [](const std::string& str)->bool{return std::equal(str.rbegin(), str.rend(), str.begin());})
    << " palindromes in the list";
}

答案 3 :(得分:0)

这一行存在问题:

if(str[0]=str[lenght - 1])

首先,变量为length lenght 仅此一项表示您发布的代码您实际运行的代码。

其次,在C中,等式比较是==,而不是单等号(用于赋值)。

答案 4 :(得分:0)

你在标签中说过C ++,所以..

#include <iostream>
#include <algorithm>
#include <string>

int main ()
{
    std::string input, tupni;
    std::cout << "Enter string: ";
    std::getline(std::cin, input);

    tupni = input;
    std::reverse(tupni.begin(), tupni.end());

    if(tupni==input){
        std::cout << "Is a palindrome" <<std::endl;
    }else{
        std::cout << "Not a palindrome" <<std::endl;
    }
}

这使用STL中的reverse算法。始终查看现有的可用算法。几乎总会有一些东西可以帮助您快速解决问题。

这里的字符串副本有点浪费。为了提高效率,请使用Stephan建议的反向itterator方法。