Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zx spectrum
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 6
#1

Определение палиндром или нет - C++

12.10.2012, 12:35. Просмотров 734. Ответов 6
Метки нет (Все метки)

Здравствуйте. Данна программа, которая определяет является ли число полиндромом или нет. Сижу разбираю код программы и не могу понять как в цикле b может стать равной a. По идее так и должно быть, что условие выполниться когда b равно a. Но ведь в цикле b всегда будет принимать значение из одной цифры. Например я загадал число 123. Перед выходом из цикла последнее значение b будет равно 1. Как программа тогда работает, объясните пожалуйста. Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
int main()
{
    int a; //Исходное число
    cin >> a; //Вводим его с клавиатуры
    int temp = a; //Объявляем временную переменную со значением исходного числа
 
    int b = 0; //Число перевернутое
 
    while (temp != 0)
    {
          b = b * 10 + temp % 10; //Переворачиваем число по цифрам
          temp /= 10; //Отбрасываем последнюю цифру
    }
 
    if (a == b)
          std::cout << "Палиндром!";
    else
          std::cout << "Fail :(";
    system ("pause");
    
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
757 / 690 / 124
Регистрация: 27.07.2012
Сообщений: 1,975
Завершенные тесты: 3
12.10.2012, 12:53     Определение палиндром или нет #2
C++
1
2
3
4
5
while (temp != 0)
 {
     b = b * 10 + temp % 10; //Переворачиваем число по цифрам
     temp /= 10; //Отбрасываем последнюю цифру
 }
Цитата Сообщение от zx spectrum Посмотреть сообщение
Но ведь в цикле b всегда будет принимать значение из одной цифры
Откуда такой вывод? b принимает значение одной цифры (последней цифры temp на каждой итерации) плюс то, что уже содержалось в b, помноженное на 10. Например, если вначале цикла b = 25, а temp = 41, то после b = b * 10 + temp % 10 - b = 251.
zx spectrum
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 6
12.10.2012, 13:09  [ТС]     Определение палиндром или нет #3
Цитата Сообщение от John Prick Посмотреть сообщение
C++
1
2
3
4
5
while (temp != 0)
 {
     b = b * 10 + temp % 10; //Переворачиваем число по цифрам
     temp /= 10; //Отбрасываем последнюю цифру
 }
Откуда такой вывод? b принимает значение одной цифры (последней цифры temp на каждой итерации) плюс то, что уже содержалось в b, помноженное на 10. Например, если вначале цикла b = 25, а temp = 41, то после b = b * 10 + temp % 10 - b = 251.
Я имею в виду при выходе из цикла, в этой программе. Значение b будет сотоять из одной цифры. Программа работает, но я не понимаю как это получается. (Я циклы изучаю второй день). Например я задал программе цифру 123.
В первом цикле - b = 3, temp = 12
Второй цикл b = 2, temp = 1
Третии цикл b= 1, temp = 0

И тут программа выходит из цикла со значением b=1. Или я неправильно считаю?
John Prick
757 / 690 / 124
Регистрация: 27.07.2012
Сообщений: 1,975
Завершенные тесты: 3
12.10.2012, 13:20     Определение палиндром или нет #4
Цитата Сообщение от zx spectrum Посмотреть сообщение
Я имею в виду при выходе из цикла, в этой программе. Значение b будет сотоять из одной цифры.
Ну с какого перепугу из одной цифры?? Обясни, почему ты так думаешь?

Добавлено через 5 минут
Цитата Сообщение от zx spectrum Посмотреть сообщение
Например я задал программе цифру 123.
В первом цикле - b = 3, temp = 12
Второй цикл b = 2, temp = 1
Третии цикл b= 1, temp = 0
И тут программа выходит из цикла со значением b=1. Или я неправильно считаю?
Конечно не правильно!
Вот цикл:
C++
1
2
3
4
5
while (temp != 0)
 {
     b = b * 10 + temp % 10; //Переворачиваем число по цифрам
     temp /= 10; //Отбрасываем последнюю цифру
 }
Итак, вводим 123. Поехали.
Начальные установки: b = 0, temp = 123;
1) b = b * 10 + temp % 10 = 0 * 10 + 123 % 10 = 0 + 3 = 3;
temp /= 10 = 123 / 10 = 12 // только целая часть остаётся, так как temp типа int
2) b = b * 10 + temp % 10 = 3 * 10 + 12 % 10 = 30 + 2 = 32;
temp /= 10 = 12 / 10 = 1;
3) b = b * 10 + temp % 10 = 32 * 10 + 1 % 10 = 320 + 1 = 321;
temp /= 10 = 1 / 10 = 0;
temp == 0 - выходим из цикла. Получили b = 321. Чудо!
zx spectrum
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 6
12.10.2012, 13:23  [ТС]     Определение палиндром или нет #5
Цитата Сообщение от John Prick Посмотреть сообщение
Ну с какого перепугу из одной цифры?? Обясни, почему ты так думаешь?
Ну наверно потому что перед выходом из цикла переменная b имела значение 1. Значит после выхода из цикла, по условию a сравнивается с b. То есть программе это будет как 123==1. Правильно я думаю или нет?
John Prick
757 / 690 / 124
Регистрация: 27.07.2012
Сообщений: 1,975
Завершенные тесты: 3
12.10.2012, 13:24     Определение палиндром или нет #6
Цитата Сообщение от zx spectrum Посмотреть сообщение
Ну наверно потому что перед выходом из цикла переменная b имела значение 1
На что спорим, что это не так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2012, 13:29     Определение палиндром или нет
Еще ссылки по теме:

C++ Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет
C++11 в production, да или нет? C++
Как найти текст в файле и возвратить 0 или 1 в зависимости от того,найдено или нет? C++
определение местоположения роутера с использованием 3х устройств или 3х замеров C++
Вывести True или False в зависимости от того, имеют три заданных целых числа одинаковую четность или нет C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zx spectrum
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 6
12.10.2012, 13:29  [ТС]     Определение палиндром или нет #7
Цитата Сообщение от John Prick Посмотреть сообщение
Ну с какого перепугу из одной цифры?? Обясни, почему ты так думаешь?

Добавлено через 5 минут

Конечно не правильно!
Вот цикл:
C++
1
2
3
4
5
while (temp != 0)
 {
     b = b * 10 + temp % 10; //Переворачиваем число по цифрам
     temp /= 10; //Отбрасываем последнюю цифру
 }
Итак, вводим 123. Поехали.
Начальные установки: b = 0, temp = 123;
1) b = b * 10 + temp % 10 = 0 * 10 + 123 % 10 = 0 + 3 = 3;
temp /= 10 = 123 / 10 = 12 // только целая часть остаётся, так как temp типа int
2) b = b * 10 + temp % 10 = 3 * 10 + 12 % 10 = 30 + 2 = 32;
temp /= 10 = 12 / 10 = 1;
3) b = b * 10 + temp % 10 = 32 * 10 + 1 % 10 = 320 + 1 = 321;
temp /= 10 = 1 / 10 = 0;
temp == 0 - выходим из цикла. Получили b = 321. Чудо!
Все дошло теперь как программа считает. Я считал так (по примеру второй строки) b = b * 10 + temp % 10 =3*10+12%10= 42%10=2. Неправильно считал я. Спасибо за помощь!!
Yandex
Объявления
12.10.2012, 13:29     Определение палиндром или нет
Ответ Создать тему
Опции темы

Текущее время: 17:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru