kacToHbI4
@kacToHbI4
11 лет anykey - надоело, хочу в разработчики.

Почему не срабатывает алгоритм определения палиндрома числа?

Решил одну задачку из книги Дейтелов:
spoiler
Палиндромом называется число или фраза текста, которая читается одинаково как слева направо, так и в обратном порядке. Например, каждое из следующих пятизначных целых чисел является палиндромом: 12321, 55555, 45554 и 11611. Напишите программу, которая считывает пятизначное целое число и определяет, является ли оно палиндромом. (Подсказка: примените операции деления и взятия по модулю для разложения числа на отдельные цифры.)


И всё работает, однако есть нюанс, мне как новичку сложно понять в чем именно проблема, то есть понятно что в алгоритме, но вот где именно?

Собственно код:
spoiler
/*Program that reads in a five-digit integer and determines whether or not it’s a palindrome.*/
/*Created by kacToHbI4*/

#include <stdio.h>

int main(void)
{
    int a,
        num1 = 10000, num2 = 1000, num3 = 100, num4 = 10, num5 = 1,
        num2_1, num3_1, num4_1, num5_1,
        result1, result2, result3, result4, result5;

    printf("Enter a five-digit number: ");
    scanf("%d", &a);

    /*****Block for separates the number into its individual digits.*****/
    /********************************************************************/
    result1 = a / num1;
    num2_1 = a % num1;
    result2 = num2_1 / num2;
    num3_1 = num2_1 % num2;
    result3 = num3_1 / num3;
    num4_1 = num3_1 % num3;
    result4 = num4_1 / num4;
    num5_1 = num4_1 % num4;
    result5 = num5_1 / num5;

    /*****This block determines whether or not it’s a palindrome.*****/
    /*****************************************************************/
    if(result1 == result5)
        {
            if(result2 == result4)
                printf("It's a palindrome.\n");
        }
    else printf("This is not palindrome.\n");

    return 0;
}


Все числа обрабатываются нормально, кроме ситуации с тремя нулями, причем ситуации когда либо один 0 в начале и два в конце, либо когда наоборот два 0 в начале и один в конце, ниже пример моих тестов:

spoiler
~/workspace/chapter3/ $ gcc 3.35.c -o 3.35.exe
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 01200
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 00120
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 01300
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 012345
This is not palindrome.
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 01210
It's a palindrome.
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 00200
It's a palindrome.
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 01200
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 01100
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 00110
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 00011
This is not palindrome.
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 09900
~/workspace/chapter3/ $ ./3.35.exe
Enter a five-digit number: 00990
~/workspace/chapter3/ $


Этот же алгоритм, но в другой задаче работает прекрасно с любой комбинацией цифр, ну естественно я не смог протестировать все 10000 комбинаций.
Задача:
spoiler
Напишите программу, которая считывает число из пяти цифр, разделяет это число на отдельные цифры и выводит эти цифры на печать, отделяя одну от другой тремя пробелами. Например, если пользователь ввел число 42339, программа должна напечатать.
4 2 3 3 9


Мой код:
spoiler
#include <stdio.h>

int main(void)
{
	int a, num1 = 10000, num2 = 1000, num3 = 100, num4 = 10, num5 = 1,
		result1, result2, result3, result4, result5,
		num2_1, num3_1, num4_1, num5_1;

	printf("Enter a five digit number: ");
	scanf("%d", &a);
		result1 = a / num1;
		num2_1 = a % num1;
		result2 = num2_1 / num2;
		num3_1 = num2_1 % num2;
		result3 = num3_1 / num3;
		num4_1 = num3_1 % num3;
		result4 = num4_1 / num4;
		num5_1 = num4_1 % num4;
		result5 = num5_1 / num5;

	printf("%d\t%d\t%d\t%d\t%d\t\n", result1, result2, result3, result4, result5);

	return 0;

}


Тесты:
spoiler
~/workspace/chapter2/ $ ./2.30.exe
Enter a five digit number: 12342
1 2 3 4 2
~/workspace/chapter2/ $ ./2.30.exe
Enter a five digit number: 00001
0 0 0 0 1
~/workspace/chapter2/ $ ./2.30.exe
Enter a five digit number: 00012
0 0 0 1 2
~/workspace/chapter2/ $ ./2.30.exe
Enter a five digit number: 00120
0 0 1 2 0
~/workspace/chapter2/ $ ./2.30.exe
Enter a five digit number: 00000
0 0 0 0 0
~/workspace/chapter2/ $ ./2.30.exe
Enter a five digit number: 98756
9 8 7 5 6
~/workspace/chapter2/ $ ./2.30.exe
Enter a five digit number: 01350
0 1 3 5 0


И есть дальше задача где я хотел применить подобный алгоритм, но если в нем ошибка, то и задачу решать надо после исправления алгоритма.
Пытаюсь разобраться сам, но видимо маловато опыта =(
  • Вопрос задан
  • 633 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
if(result1 == result5) {
  if(result2 == result4) {
    printf("It's a palindrome.\n");
  } // а если не равно, то что выдать?
} else {
  printf("This is not palindrome.\n");
}

У вас ничего не выводится если первая и последняя цифры равны, а вторая и предпоследняя - нет. Оформляйте код нормально, такие ошибки будут гораздо заметнее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kacToHbI4
@kacToHbI4 Автор вопроса
11 лет anykey - надоело, хочу в разработчики.
Всем спасибо, работает, код следующий:

/*Program that reads in a five-digit integer and determines whether or not it’s a palindrome.*/
/*Created by kacToHbI4*/

#include <stdio.h>

int main(void)
{
    int a,
        num1 = 10000, num2 = 1000, num3 = 100, num4 = 10, num5 = 1,
        num2_1, num3_1, num4_1, num5_1,
        result1, result2, result3, result4, result5;

    printf("Enter a five-digit number: ");
    scanf("%d", &a);

    /*****Block for separates the number into its individual digits.*****/
    /********************************************************************/
    result1 = a / num1;
    num2_1 = a % num1;
    result2 = num2_1 / num2;
    num3_1 = num2_1 % num2;
    result3 = num3_1 / num3;
    num4_1 = num3_1 % num3;
    result4 = num4_1 / num4;
    num5_1 = num4_1 % num4;
    result5 = num5_1 / num5;

    /*****This block determines whether or not it’s a palindrome.*****/
    /*****************************************************************/
    if(result1 == result5)
        {
            if(result2 == result4)
            {
                printf("It's a palindrome.\n");
            }
        }
    if(result1 != result5)
    {
        printf("This is not palindrome.\n");
    }
    else if(result2 != result4)
    {
        printf("This is not palindrome.\n");
    }

    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы