Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2011, 02:23   #1
Negent
Студент
Пользователь
 
Аватар для Negent
 
Регистрация: 11.06.2010
Сообщений: 39
Радость Определение палиндрома без массивов

Как известно, существует, уже ставшая классической задача сравнения массивов на их сходство. Например, частный случай - является ли палиндромом введённое число. Обычно делают так: вводят число в массив (разделяя цифры пробелами, например), и дальше сравнивают, начиная с крайнего левого и крайнего правого разряда, двигаясь к центру. Однако, мой интерес привлекла задача из учебника Дейтелов, в которой авторы предлагают решить задачу, не прибегая к помощи массивов. Задачу я решал очень долго, но всё-таки решение нашёл и решил его опубликовать - поделиться кодом. Вдруг, кто-то из преподавателей захочет дать эту задачу как задачу для сообразительных на высший балл по предмету "программирование".
В общем, решение:

Цитата:
#include "stdafx.h"

#include <iostream>
#include <string>

using namespace std;

void main ()
{
string nameT;
int palindrome, palindromeT, palindromeR, discharges;
int i=1;
cout<<"Please enter your name: ";
cin>>nameT;
cout<<"Hello, "<<nameT<<"! It's palindrome program.\n"<<"If the entered positive digit is palindrome, program says to you...\n";
cout<<"Enter the possible palindrome: ";
//Программа не определяет симметрию отрицательных чисел. Число, предполагаемый кандидат в палиндромы, вводится без знака
cin>>palindrome;
palindromeR = palindrome;
//Определяем размер числа (количество разрядов)
while (palindromeR > 10)
{
palindromeT = palindromeR % 10;
palindromeR = palindromeR / 10;
i=i+1;
}
int a = i;
int c = i;
int k;
i = 0;
palindromeR = palindrome;
palindromeT = palindrome;
cout<<"Discharges: "<<a<<endl;
if (a >= 2) //Если число, предлагаемое к тестированию на свойство палиндрома, имеет один знак - тестирование не производится
{
int tenMax, palindromeS, palindromeM;
cout<<"If you see words 'Digit missed' - it's not palindrome!\n";
while (i < a)
{
//Считывание значений разрядов снизу вверх, начиная с младшего.
//Выполняется операция деления на 10, узнаём остаток от числа (это крайний правый разряд)
//Потом сокращаем наше тестируемое число-образец на один разряд (целочисленным делением на 10).
palindromeS = palindromeR % 10;
palindromeR = palindromeR / 10;
tenMax = 1;
k = c;
palindromeT = palindrome;
while (k > 1)
{
//Считывание значений разрядов сверху вниз, начиная со старшего.
//Выполняется операция деления на 10 в степени, ( 10 в такой степени, что на один разряд меньше разрядной величины числа).
//Далее, вычисляется остаток от деления на 10. Узнаём величину старшего разряда.
k = k - 1;
tenMax = tenMax * 10;
};
c = c - 1;
i = i + 1;
palindromeM = palindromeT / tenMax;
palindromeM = palindromeM % 10;
cout<<palindromeS<<endl<<palindrome M<<endl;
//Полученные значения разрядов используются для сравнения. Если цифры не соответствуют, выдаётся сообщение "Цифра пропущена"
if (palindromeS != palindromeM) cout<<"Digit missed!\n";
else cout<<"Okay!\n";
};
}
//Если ввести число из одного разряда (частный случай палиндрома), то будет выведено соответствующее значение
else cout<<"You have very small digit. It's not the palindrome!\n";
system ("pause");
}
P. S. Использовалась среда программирования MS Visual Studio 2008.
"...Попытайся ухватить звёзды с небес, чем переживай, что до них не дотянуться..."
Negent вне форума Ответить с цитированием
Старый 09.12.2011, 04:15   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

че-то как-то вы перемудрили, имхо. Задача на 1 цикл из 3-х строчек, и никаких массивов.

http://ideone.com/cx1rK
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.12.2011, 09:38   #3
Negent
Студент
Пользователь
 
Аватар для Negent
 
Регистрация: 11.06.2010
Сообщений: 39
Сообщение

Цитата:
Сообщение от veniside Посмотреть сообщение
че-то как-то вы перемудрили, имхо. Задача на 1 цикл из 3-х строчек, и никаких массивов.

http://ideone.com/cx1rK
Странное какое-то решение на Pascal'е. Сомневаюсь, что оно будет работать:
Цитата:
var
P, P2, P3: Integer;
begin
readln(P);
//
P2 := 0;
P3 := P;
while (P3 <> 0) do begin
//
P2 := P2 * 10 + (P3 mod 10);
P3 := P3 div 10;
end;
//
if (P = P2) then writeln('Палиндром')
else writeln('Не совсем');
end.
У меня же сделано так: делением и вычислением остатка вычисляются отдельно значения старшего и младшего разрядов, сравниваются, затем происходит сдвиг - вычисляются значения более младшего и более старшего разряда, опять сравниваются... И так далее, пока всё число не будет обработано.
"...Попытайся ухватить звёзды с небес, чем переживай, что до них не дотянуться..."
Negent вне форума Ответить с цитированием
Старый 09.12.2011, 11:15   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от Negent Посмотреть сообщение
Странное какое-то решение на Pascal'е. Сомневаюсь, что оно будет работать
Будет, будет. В приведенном решении вычисляется перевернутое число (записывается в Р2) и сравнивается с исходным.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 09.12.2011, 12:01   #5
Negent
Студент
Пользователь
 
Аватар для Negent
 
Регистрация: 11.06.2010
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Будет, будет. В приведенном решении вычисляется перевернутое число (записывается в Р2) и сравнивается с исходным.
Отличная идея - обрабатывать перевёрнутое число. Надо будет попробовать.
Однако, надо предпринять дополнительные меры, ведь число может содержать нули впереди, и если число будет просто "перевёрнуто", то нули окажутся в младших разрядах и автоматически умножат число на n-ое количество десятков.
"...Попытайся ухватить звёзды с небес, чем переживай, что до них не дотянуться..."

Последний раз редактировалось Negent; 09.12.2011 в 12:24.
Negent вне форума Ответить с цитированием
Старый 09.12.2011, 17:27   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> ведь число может содержать нули впереди

если по-вашему числа 33 и 033 чем-то отличаются, то это уже не числа, а строки.

> Сомневаюсь, что оно будет работать

а вы попробуйте. По ссылке там есть поле "upload with new input", там можно ввести любое число, и оно выдаст результат.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.12.2011, 17:31   #7
Negent
Студент
Пользователь
 
Аватар для Negent
 
Регистрация: 11.06.2010
Сообщений: 39
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> ведь число может содержать нули впереди

если по-вашему числа 33 и 033 чем-то отличаются, то это уже не числа, а строки.

> Сомневаюсь, что оно будет работать

а вы попробуйте. По ссылке там есть поле "upload with new input", там можно ввести любое число, и оно выдаст результат.
Спасибо, я обязательно попробую запустить программу в BP.
"...Попытайся ухватить звёзды с небес, чем переживай, что до них не дотянуться..."
Negent вне форума Ответить с цитированием
Старый 09.12.2011, 17:46   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Не нужен BP, прям на сайте пробуйте, оно само запустит и само выдаст. Я там уже несколько разных чисел пробовал для проверки.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с действительными числами без массивов foxy342 Помощь студентам 1 16.12.2010 11:17
утверждение Ферма без массивов [Паскаль] syrga Помощь студентам 1 05.12.2010 13:54
Паскаль.Определение числа палиндрома uropb992 Помощь студентам 6 09.06.2010 04:58
Транспонировать матрицу(Без исп. доп. массивов)) Doublefaced Помощь студентам 4 27.06.2009 13:03