Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Полиндром (язык С)

20K
11 октября 2006 года
luksor
8 / / 09.10.2006
Вот ещё одна задачка с решением.Нужна программа которая которая считывала бы пятизначное число и определяла бы палиндром оно или нет:

Код:
/* Задача #3.35 */
#include <stdio.h>
 
int main(void) {
   int a, b, c, d, e, x, y;
   printf("Введите пятизначное число для определения палиндром оно или нет: ");
   scanf("%d", &x);
 
   a = x % 10000;
   b = x % 1000;
   c = x % 100;
   d = x % 10;
   e = x - a;
   a -= b;
   b -= c;
   c -= d;
 
   y = d * 10000 + c * 100 + b * 1 + a / 100 + e / 10000;
 
   if(x == y)
      printf("Введённое вами число является палиндромом!\n");
   else
      printf("Введённое вами число не палиндром!\n");
   return 0;
}


У кого есть свои варианты?

[COLOR=red]для каждой задачи создавай пожалуйста новую тему. читай правила форума . (Moderator)[/COLOR]
[COLOR=#ff0000][/COLOR]
20K
12 октября 2006 года
luksor
8 / / 09.10.2006
Вот другой вариант этой задачи:

Код:
/* Задача #3.35 */

#include <stdio.h>

int main(void) {
   int a, b, c, d, e, x;
   printf("Введите пятизначное число для проверки полиндром оно или нет: ");
   scanf("%d", &x);

   a = x / 10000;
   b = (x / 1000) % 10;
   c = (x / 100) % 10;
   d = (x / 10) % 10;
   e = x % 10;

   if(a == e && b == d)
      printf("Введённое вами число палиндром.\n\n");
   else
      printf("Введённое вами число не палиндром.\n\n");
}
242
12 октября 2006 года
Оlga
2.2K / / 04.02.2006
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int isPolindrome(int num)
{
 char str[11];
 int i, j;
 itoa(num, str, 10); //переводим число в массив символов
 for(i = 0, j = strlen(str)-1; i < j; i++, j--)
  if(str != str[j]) return 0; // num isn't polindrome
 return 1; // num is polindrome
 
}
 
int main(void)
{
 int n;
 printf("Enter a number: ");
 scanf("%d", &n);
 if( isPolindrome(n) )
  printf("Number %d is polindrome\n\n", n);
 else
  printf("Number %d isn't polindrome\n\n", n);
 return 0;
}
3.0K
12 октября 2006 года
Мerlin
267 / / 25.07.2006
Код:
#include <stdio.h>

int main(void)
{
   int x;
   printf("Введите пятизначное число для определения палиндром оно или нет: ");
   scanf("%d", &x);
 
 
   if((x%10)*10+(x%100)/10 == x/1000)
      printf("Введённое вами число является палиндромом!\n");
   else
      printf("Введённое вами число не палиндром!\n");

   return 0;
}
20K
12 октября 2006 года
luksor
8 / / 09.10.2006
Merlin твой вариант изящен, снимаю шляпу :)
OlgaKr я к сожалению до масивов пока не дошёл :( но всё равно спасибо!
15K
17 августа 2007 года
like-nix
46 / / 27.06.2007
Цитата: Мerlin
Код:
#include <stdio.h>

int main(void)
{
   int x;
   printf("Введите пятизначное число для определения палиндром оно или нет: ");
   scanf("%d", &x);
 
 
   if((x%10)*10+(x%100)/10 == x/1000)
      printf("Введённое вами число является палиндромом!\n");
   else
      printf("Введённое вами число не палиндром!\n");

   return 0;
}


При всем уважении к Мerlin я не понимаю как эта программа определит палендром

355
17 августа 2007 года
&lt;SCORP&gt;
786 / / 21.10.2006
хы :) я тоже сразу не понял.... а довольно забавный вариант, хотя и не очень читабельный. и подходит ТОЛЬКО для пятизначных чисел (короче, поставленную задачу она должна решать)
2like-nix смотри:
(x%10) -- последняя цифра числа
(x%100)/10 -- предпоследняя цифра числа
(x%10)*10+(x%100)/10 -- число состоящее из двух последних цифр исходного числа, только если их поменять местами (т.е. для числа 12345 результатом этого выражения будет 54)
x/100 -- число, состоящее из первых двух цифр исходного числа (12 в предыдущем примере)
третья цифра никого не интересует, ибо она никуда не двигается при зеркальном отображении числа.
остается только сравнить перевернутые последние дву цифры с первыми двумя
в теории должно работать :)
15K
17 августа 2007 года
like-nix
46 / / 27.06.2007
[QUOTE=<SCORP>;207137]хы :) я тоже сразу не понял.... а довольно забавный вариант, хотя и не очень читабельный. и подходит ТОЛЬКО для пятизначных чисел (короче, поставленную задачу она должна решать)
2like-nix смотри:
(x%10) -- последняя цифра числа
(x%100)/10 -- предпоследняя цифра числа
(x%10)*10+(x%100)/10 -- число состоящее из двух последних цифр исходного числа, только если их поменять местами (т.е. для числа 12345 результатом этого выражения будет 54)
x/100 -- число, состоящее из первых двух цифр исходного числа (12 в предыдущем примере)
третья цифра никого не интересует, ибо она никуда не двигается при зеркальном отображении числа.
остается только сравнить перевернутые последние дву цифры с первыми двумя
в теории должно работать :)[/QUOTE]
а довольно забавный вариант, хотя и не очень читабельный. и подходит ТОЛЬКО для пятизначных чисел
Это я понял

И OlgaKr 15 символов больше чем int
вот рабочий вариант
Код:
#include <stdio.h>
#include <string.h>
main(){
int i;
def:
printf("Enter a number: ");
char str[16];
scanf("%s", str);
for (i=0;i<strlen(str);i++) if(str<49 || str>57) goto def;
if (strlen(str)==1) printf("true");
for (i=0; i<(strlen(str)/2);i++) {
    if (str==str[strlen(str)-(i+1)]){
        if(i==((strlen(str)/2)-1)) printf("true");
    } else {
        printf("false"); break;
    }
};
}

[COLOR="Red"]Форматируй код по правилам.[/COLOR]Модератор.
15K
17 августа 2007 года
like-nix
46 / / 27.06.2007
Прошу прощения неправильно прочитал название темы там надо было определить 5-и значное а не 15-и))))
350
20 августа 2007 года
cheburator
589 / / 01.06.2006
А не проще ли вводить просто символы вместо числа.
Я так понимаю, число - натуральное, достаточно проверить принадлежность всех символов к множеству {0...9}.
Так и введем строку, или массив символов, и сравним каждый символ с соответствующим символом с конца.
Алгоритм работает, практически, для произвольных чисел.
Проверку на {0...9} можно произвести вместе со сравнением.
263
20 августа 2007 года
koltaviy
816 / / 16.12.2004
Цитата: cheburator
А не проще ли вводить просто символы вместо числа.
Я так понимаю, число - натуральное, достаточно проверить принадлежность всех символов к множеству {0...9}.
Так и введем строку, или массив символов, и сравним каждый символ с соответствующим символом с конца.
Алгоритм работает, практически, для произвольных чисел.
Проверку на {0...9} можно произвести вместе со сравнением.


Прочти пост OlgaKr.
Вариант Мerlin может и рабочий, но, ИМХО, извращение.. хоть и оригинально ;)

2.0K
20 августа 2007 года
WidowMaker
212 / / 05.04.2005
2cheburator
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
void main()
{
 char str1[11];
 char str2[11];
 int num;
 printf("Input number: ");
 scanf("%d", &num);
 
 strcpy(str2,itoa(num, str1, 10));
 printf("number %d %s polindrome\n",num, (strcmp(str2,strrev(str1)))? "isn't": "is");
}
350
23 августа 2007 года
cheburator
589 / / 01.06.2006
В варианте WidowMaker тратится время на то, чтобы перевернуть строку, затем сравнить ее перевернутую с ней неперевернутой. А можно сравнить без переворачивания, выделения памяти под новую строку и т. д.
Код:
#include <string>
#include <iostream>

using namespace std;

void main ()
{
    try
    {
        string s;
        cout << "Enter number: ";
        cin >> s;
        const size_t slen = s.size();
        for (size_t i = 0; i < slen/2; ++i)
        {
            if (s < '0' || s > '9')
                throw exception ("Not a number");
            if (s != s[slen-i-1])
            {
                cout << "Not polindrome";
                return;
            };
        };
        if (slen % 2 == 1 && (s[slen/2] < '0' || s[slen/2] > '9'))
            throw exception ("Not a number");
        cout << "Polindrome";
    }
    catch (exception &ex)
    {
        cerr << ex.what() << endl;
    }
};
54K
20 октября 2009 года
lioncub
1 / / 20.10.2009
Вот состряпал... для любого числа:
Код:
#include <iostream>
using namespace std;

int main()
{
    int a, x, y;
    int sum = 0;

    cout << "Введите число: ";
    cin >> x;
    y = x;

    if (x > 10) {
        while (x > 0) {
            a = x % 10;
            sum = sum * 10 + a;
            x = x / 10;
        }
    }

    if(y == sum)
        cout << "Введённое вами число палиндром.\n";
    else
        cout << "Введённое вами число не палиндром. " << y << " != " << sum << endl;

    return 0;
}
34K
25 октября 2009 года
muturgan
96 / / 01.10.2009
Цитата: lioncub
Вот состряпал... для любого числа:



Зачем придумывать что-то новое, когда cheburator предложил отличный вариант проверки. Только непонятно зачем нужны точки с запятой после блока if и for, не скомпилится же

7
25 октября 2009 года
@pixo $oft
3.4K / / 20.09.2006
Где они?Не вижу,вроде всё нормально.А вы пробовали скомпилировать?
И ещё:а вы пробовали глядеть на дату последнего поста?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог