Программа C, чтобы определить, является ли число палиндромом или нет

Я сделал программу на C, чтобы проверить, является ли число палиндромом или нет. Я использовал следующий код, но он показывает такие числа, как 12321, как не палиндром. Не могли бы вы объяснить мне ошибку в программе ниже?

#include <stdio.h>
int main()
{
    int i, x, n, c, j;
    int d=0;
    printf ("enter total digits in number: ");
    scanf ("%d", &i);
    printf ("\nenter number: ");
    scanf ("%d", &n);
    j=n;
    for (x=1; x<=i; x++)
    {
       c= j%10;
       d=c*(10^(i-x))+d;
       j=(j-c)/10;
    }
    if (d==n)
    {
        printf ("\npalindrome");
    }
    else
    {
        printf ("\nnon palindrome");
    }
    return 0;
}

person Tarun Khare    schedule 19.11.2015    source источник
comment
^ — это оператор XOR в C.   -  person BLUEPIXY    schedule 19.11.2015
comment
Вы не проверили возвращаемое значение вызовов scanf. Откуда вы знаете, что они преуспели?   -  person user694733    schedule 19.11.2015
comment
можно пожалуйста поподробнее простыми словами?   -  person Tarun Khare    schedule 19.11.2015
comment
10^x не означает 10, возведенное в степень x, но это означает 10 xor x, xor является исключающим или оператором, это не то, что вам нужно. Ваши scanf в порядке, пока вы вводите числа.   -  person Jabberwocky    schedule 19.11.2015
comment
d=c*(10^(i-x))+d; --› d = d * 10 + c; также j=(j-c)/10; просто j /= 10;   -  person BLUEPIXY    schedule 19.11.2015


Ответы (3)


^ — это оператор xor.

Для того чтобы поднять мощность, нужно включить math.h и вызвать pow

d = (c * pow(10, i - x)) + d;
person rohit89    schedule 19.11.2015

этот алгоритм так же прост, как человеческое мышление, и он работает

#include <stdio.h>


int main() {
    int i=0,n,ok=1;
    char buff[20];


    printf("Enter an integer: ");
    scanf("%d", &n); // i am ommiting error checking

    n=sprintf(buff,"%d",n); //convert it to string, and getting the len in result
    if(n<2) return 0;

    i=n/2;
    n--;
    while(i && ok) {
        i--;
        //printf("%c == %c %s\n", buff[i],buff[n-i],(buff[i]==buff[n-i])?"true":"false");
        ok &= (buff[i]==buff[n-i]);

    }

    printf("%s is %spalindrome\n",buff, ok?"":"not ");
    return 0;
}
person milevyo    schedule 19.11.2015
comment
Как насчет того, чтобы отказаться от scanf("%d",...) / sprintf и просто заняться scanf("%s", buf); вместо этого...? ;) - person CiaPan; 19.11.2015
comment
сначала было так, но я изменил его, чтобы следовать его исходному коду. потому что он имеет дело с целыми числами - person milevyo; 19.11.2015

Такой цикл может сделать:

int src;     // user input
int n;       // no of digits
int res = 0;
int tmp;     // copy of src

// .... read the input: n and src ....

tmp = src;
for(int i = 0; i < n; i ++)
{
    int digit = tmp % 10;  // extract the rightmost digit
    tmp /= 10;             // and remove it from source
    res = 10*res + digit;  // apend it to the result
}

// ...and test if(res == src)...
person CiaPan    schedule 19.11.2015