Как проверить, является ли число палиндромом? - PullRequest
120 голосов
/ 14 октября 2008

Как проверить, является ли число палиндромом?

Любой язык. Любой алгоритм. (кроме алгоритма преобразования числа в строку и последующего обращения строки).

Ответы [ 50 ]

1 голос
/ 04 мая 2012

вот версия f #:

let reverseNumber n =
    let rec loop acc = function
    |0 -> acc
    |x -> loop (acc * 10 + x % 10) (x/10)    
    loop 0 n

let isPalindrome = function
    | x  when x = reverseNumber x -> true
    | _ -> false
1 голос
/ 03 июня 2014

Для проверки заданного числа есть палиндром или нет (код Java)

class CheckPalindrome{
public static void main(String str[]){
        int a=242, n=a, b=a, rev=0;
        while(n>0){
                    a=n%10;  n=n/10;rev=rev*10+a;
                    System.out.println(a+"  "+n+"  "+rev);  // to see the logic
               }
        if(rev==b)  System.out.println("Palindrome");
        else        System.out.println("Not Palindrome");
    }
}
1 голос
/ 06 марта 2015

Многие решения, размещенные здесь, обращают целое число и сохраняют его в переменной, которая использует дополнительный пробел, равный O(n), но здесь есть решение с O(1) пробелом.

def isPalindrome(num):
    if num < 0:
        return False
    if num == 0:
        return True
    from math import log10
    length = int(log10(num))
    while length > 0:
        right = num % 10
        left = num / 10**length
        if right != left:
            return False
        num %= 10**length
        num /= 10
        length -= 2
    return True
1 голос
/ 02 августа 2011

метод с немного лучшим постоянным коэффициентом, чем метод @sminks:

num=n
lastDigit=0;
rev=0;
while (num>rev) {
    lastDigit=num%10;
    rev=rev*10+lastDigit;
    num /=2;
}
if (num==rev) print PALINDROME; exit(0);
num=num*10+lastDigit; // This line is required as a number with odd number of bits will necessary end up being smaller even if it is a palindrome
if (num==rev) print PALINDROME
0 голосов
/ 08 января 2016

публичный класс PalindromePrime {

 private static int g ,n =0,i,m ; 

 private javax.swing.JTextField jTextField;



 static String b ="";
private static Scanner scanner = new Scanner( System.in );  
public static void main(String [] args) throws IOException {


    System.out.print(" Please Inter Data : "); 
    g = scanner.nextInt();


    System.out.print(" Please Inter Data 2  : "); 
    m = scanner.nextInt();  

    count(g,m);     
    }   

public static    int count(int L, int R) {
    int resultNum = 0;

    for( i= L ; i<= R ;i++){
        int count= 0 ;
        for( n = i ; n >=1 ;n -- ){

            if(i%n==0){             
                count = count + 1 ;
            //  System.out.println("  Data : \n "  +count );    
            }       
        }
        if(count == 2)
        {   
            //b = b +i + "" ;

        String ss=  String .valueOf(i);
        //  System.out.print("\n" +i );     

            if(isPalindrome(i))
            {

            //0 System.out.println("Number : " + i + " is   a palindrome");

                    //number2[b] = Integer.parseInt(number_ayy[b]);

                //String s = String .valueOf(i);
                //System.out.printf("123456", s);
                resultNum++;
            }

            else{

                //*System.out.println("Number : " + i + " is Not  a palindrome");
            }
            //System.out.println("  Data : \n " +ss.length()  );    
        }

    //  palindrome(i);

    }

//  System.out.print("  Data  : "); 
//  System.out.println("  Data : \n "  +b ); 
    return resultNum;


    }


@SuppressWarnings("unused")
public static boolean isPalindrome(int number  ) {
    int p = number; // ประกาศ  p เป็น int ให้เท่ากับ number ของ ตัวที่ มาจาก method 
    int r = 0; //ประกาศ r เป็น int โดยให้มีค่าเรื่องต้นเท่ากับ 0 
    int w = 0 ;
    while (p != 0) {  // เงื่อนไข While ถ้า p ไม่เท่ากับ 0  เช่น  2!= 0 จริง  เข้า  
         w = p % 10; // ประกาศตัว แปร W ให้ เท่ากับค่า p ที่มาจาก parramiter ให้ & mod กับ  10 คือ เช่น  2 % 10 = 2 ; w= 2 ; 3% 10 ; w =3
       r = r * 10 + w;  // (ให้  R ที่มาจาก การประกาศค่ตัวแปร แล้ว * 10) + w  จะมาจากค่า w = p % 10; ที่ mod ไว้  เช่น 0*10 + 2 = 2 
       p = p / 10;  //แล้วใช้ p ที่จมาจากตัว paramiter แล้วมาหาร  10  เพราะถ้าไม่มี ก็จะสามารถพิมพ์ค่าออกมาได้  || ทำไงก็ได้ให้เป็น 0  และเอามาแทนค่ตัวต่อไป 
    }

    // 1 วนวูปเช็คว่า   (p != 0) หรือไม่   โดย  p มาจาก p = number ที่รับมา 
    // 2 r = (r * 10) + (p%10) ;  

    //3   p = p /10 ; เพื่อเช็ค  ว่าให้มันเป็น 0 เพื่อหลุด Loop 
    if (number == r) {
        // for(int count = 0 ; count <i ;count ++){
    String s1 = String.valueOf(i);     

        //countLines(s1);
        System.out.println("Number : " + "'"+s1 +"'"+"  is   a palindrome");

        return true; //เรียก return ไป 

    }
    return false;
}

public static int countLines(String str)
{
    if (str == null || str.length() == 0)
        return 0;
    int lines = 1;
    int len = str.length();
    for( int pos = 0; pos < len; pos++) {
        char c = str.charAt(pos);
        if( c == '\r' ) {


            System.out.println("Line 0 : " + "'"+str );

            lines++;
            if ( pos+1 < len && str.charAt(pos+1) == '\n' )

                System.out.println("Line : " + "'"+str );

                pos++;
        } else if( c == '\n' ) {
            lines++;

            System.out.println("Line 2 : " + "'"+str );

        }
    }
    return lines;
}


public static int countLines1(String sd) throws IOException {
    LineNumberReader lineNumberReader = new LineNumberReader(new StringReader(sd));
    int count = 0 ;
    System.out.printf("Line  : " , count = count + 1 );
    lineNumberReader.skip(Long.MAX_VALUE);
    return lineNumberReader.getLineNumber();
}

}

0 голосов
/ 07 января 2016

Не уверен, что это лучший ответ, и я новичок в программировании. (это в Java)

import java.util.*;

public class Palin {

    public static void main(String[] args) {
        Random randInt = new Random();

        Scanner kbd = new Scanner(System.in);
        int t = kbd.nextInt(); //# of test cases;
        String[] arrPalin = new String[t]; //array of inputs;
        String[] nextPalin = new String[t];
        for (int i = 0; i < t; i++) {
            arrPalin[i] = String.valueOf(randInt.nextInt(2147483646) + 1);
            System.out.println(arrPalin[i]);
        }

        final long startTime = System.nanoTime();

        for (int i = 0; i < t; i++) {
            nextPalin[i] = (unmatcher(incrementer(switcher(match(arrPalin[i])))));
        }

        final long duration = System.nanoTime() - startTime;

        for (int i = 0; i < t; i++) {
            System.out.println(nextPalin[i]);
        }

        System.out.println(duration);

    }

    public static String match(String N) {
        int length = N.length();

        //Initialize a string with length of N
        char[] chars = new char[length];
        Arrays.fill(chars, '0');

        int count = 1;

        for (int i = 0; i < length; i++) {
            if ((i%2) == 0) { //at i = even.
                if (i == 0) {
                    chars[i] = N.charAt(i);
                } else
                    chars[i] = N.charAt(i/2);
            } else //at i = odd
                chars[i] = N.charAt(length - count);
                count++;
        }

        return String.valueOf(chars);
    }

    public static String switcher(String N) {
        int length = N.length();
        char[] chars = new char[length];
        Arrays.fill(chars, '0');

        for (int i = 0; i < length; i++) {
            if (i != 0) {
                if ((i % 2) == 0) {
                    chars[i] = N.charAt(i);
                } else if ((i % 2) != 0) {
                    chars[i] = N.charAt(i - 1);
                }
            }
            if (i == 0) {
                chars[0] = N.charAt(0);
            }
        }
        return String.valueOf(chars);
    }

    public static String incrementer(String N) {
        int length = N.length();
        char[] chars = new char[length];
        Arrays.fill(chars, '0');

        char[] newN = N.toCharArray();

        String returnVal;

        int numOne, numTwo;

        if ((length % 2) == 0) {
            numOne = N.charAt(length-1);
            numTwo = N.charAt(length-2);
            newN[length-1] = (char)(numOne+1);
            newN[length-2] = (char)(numTwo+1);
            returnVal = String.valueOf(newN);
        } else {
            numOne = N.charAt(length-1);
            newN[length-1] = (char)(numOne+1);
            returnVal = String.valueOf(newN);
        }
        return returnVal;
    }

    public static String unmatcher(String N) {
        int length = N.length();
        char[] chars = new char[length];
        Arrays.fill(chars, '0');
        char[] newN = N.toCharArray();

        for (int i = 0; i < length; i++) {
                if (((i % 2) == 0) && (i != 0)) { // for i > 0, even
                    newN[i / 2] = N.charAt(i);
                } else if ((i % 2) == 0 && (i == 0)) { // for i = 0
                    newN[0] = N.charAt(0);
                }
            }
        for (int i = (length/2); i < length; i++) {
            newN[i] = newN[Math.abs(i - (length - 1))];
        }

        return String.valueOf(newN);
    }


}

Итак, для этого кода введите число (я сделал случайное число, сколько я хочу), он преобразует, например, входное значение от 172345 до 157423. Затем он изменит его на 117722, затем, если даже сделает его 117733, если нечетное, сделайте то же самое только с последней цифрой. Затем сделайте его 173371. Он не находит конкретно палиндром, но находит следующий по величине номер палиндрома.

0 голосов
/ 22 ноября 2015
num = int(raw_input())
list_num = list(str(num))
if list_num[::-1] == list_num:
    print "Its a palindrome"
else:
    print "Its not a palindrom"
0 голосов
/ 22 ноября 2013

Рекурсивный способ, не очень эффективный, просто укажите опцию

(код Python)

def isPalindrome(num):
    size = len(str(num))
    demoninator = 10**(size-1)
    return isPalindromeHelper(num, size, demoninator)

def isPalindromeHelper(num, size, demoninator):
    """wrapper function, used in recursive"""
    if size <=1:
        return True
    else:       
        if num/demoninator != num%10:
            return False
        # shrink the size, num and denominator
        num %= demoninator
        num /= 10
        size -= 2
        demoninator /=100
        return isPalindromeHelper(num, size, demoninator) 
0 голосов
/ 19 января 2017

Лично я делаю это таким образом, и нет никаких совпадений; код перестает проверять соответствие символов в правильном месте, имеет ли строка четную или нечетную длину. Некоторые из других методов, опубликованных выше, будут пытаться сопоставить один дополнительный раз, когда это не нужно.

Если мы используем length / 2, он все равно будет работать, но он сделает еще одну проверку, которая ему не нужна. Например, «pop» имеет длину 3. 3/2 = 1,5, поэтому он прекратит проверку, когда i = 2 (поскольку 1 <1,5, он также проверит, когда i = 1), но нам нужно, чтобы он остановился на 0, а не на одном. Первое «p» находится в позиции 0, и оно проверит себя по длине-1-0 (текущая позиция), которая является последним «p» в позиции 2, а затем мы останемся с центральной буквой, которая не нуждается в проверке. Когда мы делаем length / 2, мы останавливаемся на 1, поэтому происходит дополнительная проверка, когда я нахожусь в позиции 1 («o») и сравнивает ее с собой (length-1-i). </p>

// Checks if our string is palindromic.
var ourString = "A Man, /.,.()^&*A Plan, A Canal__-Panama!";
isPalin(ourString);

function isPalin(string) {
// Make all lower case for case insensitivity and replace all spaces, underscores and non-words.
string = string.toLowerCase().replace(/\s+/g, "").replace(/\W/g,"").replace(/_/g,"");
for(i=0; i<=Math.floor(string.length/2-1); i++) {
      if(string[i] !== string[string.length-1-i]) {
        console.log("Your string is not palindromic!");
        break;
      } else if(i === Math.floor(string.length/2-1)) {
        console.log("Your string is palindromic!");
      }
    }
}

https://repl.it/FNVZ/1

0 голосов
/ 17 октября 2016

Проверьте это решение в Java:

private static boolean ispalidrome(long n) {
        return getrev(n, 0L) == n;
    }

    private static long getrev(long n, long initvalue) {
        if (n <= 0) {
            return initvalue;
        }
        initvalue = (initvalue * 10) + (n % 10);
        return getrev(n / 10, initvalue);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...