Проблемы с поиском 3-значного Палиндрома - PullRequest
0 голосов
/ 08 января 2019

Я не могу понять, как заставить работать этот код палиндрома.

Проблема может быть в неправильном разбиении строки? Спасибо за помощь!

using System;
class Start
{

static void Main()
{
    Console.WriteLine(FindPalindroms());
    Console.ReadKey();
}

static bool IsPalindrom(int numb)
{
    string sub1 = "";
    string sub2 = "";
    string productString = "";

    productString = Convert.ToString(numb);
    sub1 = productString.Substring(0, productString.Length / 2);
    sub2 = productString.Substring(productString.Length / 2, productString.Length / 2);
    sub2 = Reverse(sub2);

    if (sub1.Equals(sub2))
    {
        return true;
    }
    return false;
}
static bool FindPalindroms()
{
    int product = 0;
    for (int i = 100; i < 999; i++)
    {
        for (int j = 100; j < 999; j++)
        {
            product = i * j;

            if (IsPalindrom(product))
            {
                Console.WriteLine("Palindrom found: " + product);
                return true;
            }
        }
    }
    return false;
}
public static string Reverse(string s)
{
    char[] charArray = s.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}
}

Вывод этого кода (не полный вывод):

Палиндром найдено: 11110

Палиндром найдено: 22220

Палиндром найдено: 33330

Найден Палиндром: 44440

1 Ответ

0 голосов
/ 08 января 2019

С Linq

public static bool IsPalindrome(string str)
{
    return String.Compare(str, new string(Enumerable.Range(1, str.Length).Select(i => str[str.Length - i ]).ToArray())) == 0;
}

без Linq

public static bool IsPalindrome2(string str)
{
    var isPalindrome = true;
    for (int i=0; i<str.Length ; i++)
    {
        if ( str[i] != str[str.Length -i -1])
        {
            isPalindrome = false;
            break;
        }
    }

    return isPalindrome;
}

Редактировать В вашем случае вы делите длину строки на половину. Допустим, у вас есть 5-значный палиндром. Вы делите длину палиндрома, которая равна 5 на 2 = 2, после чего вы получаете ее подстроку

len = str.Length  / 2 // 5/2 = 2 
part1 = str.substr(0,2);
part2 = str.substr(2,2); // this part is wrong for 5 digit number

для 4-значного числа

len = str.Length  / 2 // 4/2 = 2 
part1 = str.substr(0,2);
part2 = str.substr(2,2); // now it is giving correct result.

проверьте приведенный ниже код для решения

static bool IsPalindrom(int numb)
{
    var productString = Convert.ToString(numb);
    var sub1 = productString.Substring(0, productString.Length / 2);
    var sub2 = new string(productString.Substring(productString.Length / 2 + (productString.Length % 2 == 1 ? 1 : 0), productString.Length / 2).Reverse().ToArray());
    Console.WriteLine(sub1);
    Console.WriteLine(sub2);

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