Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Палиндром


Автор: plushevyi 24.12.2007, 18:14
Второй день мучаю программу. Она должна проверить, станет ли число a палиндромом, если к нему в конец приписать одну из цифр от 1 до 9. Я не могу понять как приблизительно код должен выглядеть. Если просто вычисление, является ли введенное число палиндромом, то код вот:
Код


#include <iostream>
using namespace std;

int main()
{
    int a, b, copy_a;
    cin>>a;
    copy_a=a;
    b=0;
    
    while (copy_a!=0)
    {
        b=b*10+copy_a%10;
        copy_a/=10; 

    if (a==b) cout<<"Введенное число явлется палиндромом"<<endl; 
    else cout<<"Введенное число НЕ является палиндромом"<<endl;
    
    
    return 0;
}


Подскажите пожалуйста, решение данной проблемы. 

Автор: bsa 24.12.2007, 18:31
переводишь число в строку, добавляешь к строке цифру в виде символа, затем создаешь вторую строку путем обратного копирования и сравниваешь, что получилось. Если строки равны, то это палиндром.

Автор: Pete 5.1.2008, 22:51
Либо умножить число на 10 и прибавить нужную цифру)

Автор: bsa 5.1.2008, 22:57
Цитата(Pete @ 5.1.2008,  22:51)
Либо умножить число на 10 и прибавить нужную цифру)

И после этого число перевернется? Палиндром это 1234321 - что слева на право, что справа на лево.

Автор: TeAnton 30.1.2008, 00:38
Код


#include <iostream>
using namespace std;
int main()
{
    int a, b, copy_a;
    cin>>a;
    copy_a=a;
    b=0;
    int c=1;
    int z=0;

    while (copy_a>=10)
    {
        int foo = copy_a%10;
        b=b*10+foo;
        z=z + c * foo;
        c*=10;
        copy_a/=10;
    }

    if (z==b) cout<<"Введенное число является палиндромом"<<endl;
    else cout<<"Введенное число НЕ является палиндромом"<<endl;

    return 0;
}


Я правильно понял задачу?

Т.е. для числа 12345432 должно вывести "Введенное число является палиндромом".


Автор: Dov 30.1.2008, 15:14
Цитата(TeAnton @  29.1.2008,  23:38 Найти цитируемый пост)
Т.е. для числа 12345432 должно вывести "Введенное число является палиндромом".

Как раз наоборот.  smile 

Автор: opjox 30.1.2008, 15:39
Цитата(bsa @  24.12.2007,  18:31 Найти цитируемый пост)
затем создаешь вторую строку путем обратного копирования и сравниваешь, что получилось

Зачем? Зачем переводить память и процессорное время? Проще сравнивать первый символ с последним (не нуль-символом), второй с предпоследним и т.д.

Автор: Pete 30.1.2008, 23:58
Цитата(bsa @  5.1.2008,  23:57 Найти цитируемый пост)
И после этого число перевернется?

Имелось в виду до перевода числа в строку по твоему правилу  smile 

Автор: TeAnton 31.1.2008, 00:02
Dov, как наоборот? На 23454321 должно вывести что число является полиндромом?

Автор: Pete 31.1.2008, 00:16
Цитата(plushevyi @  24.12.2007,  19:14 Найти цитируемый пост)
проверить, станет ли число a палиндромом, если к нему в конец приписать одну из цифр от 1 до 9

Дано n = ab...c, где a, b, ..., c --- цифры. Судя по условию, надо проверить, является ли число b...c палиндромом.

Автор: Dov 31.1.2008, 00:37
Цитата(TeAnton @  30.1.2008,  23:02 Найти цитируемый пост)
Dov, как наоборот?

Вот так:
Цитата(Pete @  30.1.2008,  23:16 Найти цитируемый пост)
 надо проверить, является ли число b...c палиндромом.


Автор: Pete 31.1.2008, 00:58
Код

#include <stdio.h>
#include <string.h>

int main( void )
{
  int i, len, hlen;
  char ns[20];

  scanf( "%s", &ns[0] );
  len = strlen( ns ) - 1;
  hlen = len/2;
  for (i = 1; i <= hlen; i++)
    if (ns[i] != ns[len - (i - 1)]) {
      printf( "No\n" );
      return 0;
    }
  printf( "Yes\n" );
  
  return 0;
}

Автор: likehood 31.1.2008, 12:26
Цитата(Pete @  31.1.2008,  00:16 Найти цитируемый пост)
Дано n = ab...c, где a, b, ..., c --- цифры. Судя по условию, надо проверить, является ли число b...c палиндромом.

ну и как же это следует из условия? по-моему, в третьем посте все правильно было написано.
вот код:
Код

#include <iostream>
using namespace std;

int reverse(int a)
{
    int copy_a=a;
    int b=0;
    
    while (copy_a!=0)
    {
        b=b*10+copy_a%10;
        copy_a/=10; 
    }

    return b;
}

int main()
{
    int a, b;
    cin>>a;
    b = reverse(a);
    a = a*10 + b%10;
    if (a == reverse(a))
        std::cout << "Yes, it is!";
    else
        std::cout << "Oops!\n";
    
    return 0;
}

Автор: TeAnton 31.1.2008, 12:55
Dov, Ну и чем тогда 12345432 не подходит. Отбрасываем 1, и получаем 2345432?

Автор: Dov 31.1.2008, 13:32
Цитата(TeAnton @  31.1.2008,  11:55 Найти цитируемый пост)
Dov, Ну и чем тогда 12345432 не подходит. Отбрасываем 1, и получаем 2345432?

TeAnton, правильно. Но у тебя-то было написано, что введённое число, т.е.  12345432, является полиндромом, а это не верно.   smile 
Вот смотри:
Цитата(TeAnton @  29.1.2008,  23:38 Найти цитируемый пост)
Т.е. для числа 12345432 должно вывести "Введенное число является палиндромом".


Автор: TeAnton 31.1.2008, 13:42
Dov, ты же понял меня, что я другое имел ввиду (подходит под условие задачи). А ты меня запутал.

Автор: Dov 31.1.2008, 13:52
Цитата(TeAnton @  31.1.2008,  12:42 Найти цитируемый пост)
Dov, ты же понял меня, что я другое имел ввиду (подходит под условие задачи). А ты меня запутал.


TeAnton, извини, я без задней мысли, случайно так вышло.  smile  

Автор: m1st 10.4.2012, 17:50
Решение этого задания есть тут: http://forum.vingrad.ru/forum/topic-348659/anchor-entry2469994/0.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)