Ali Khan Xyz Ответов: 3

Я использовал этот код, который работает хорошо, но я не знаю, как он работает.


#include<iostream>
#включить< cmath>
использование пространства имен std;
тап_п()
{
unsigned int n = 1234;
int a=n;
соиь<&ЛТ;"оригинальный номер "&ЛТ;&ЛТ;а на<<епси;
n = n % (unsigned int)pow(10.0, (double) floor(log10(n)));
cout<<"после применения кода "< & lt; n;
возвращает 0;
}
первый cout - это 1234, а второй-234, который мне был нужен, Но я не знаю, как он работает, так как я новичок. :)

Что я уже пробовал:

:P

OriginalGriff

Мы не можем прочитать код-отредактируйте свой вопрос с помощью виджета "улучшить вопрос" и вставьте его снова. На этот раз, когда он вставляется, используйте опции "блок кода" или "кодировать HTML" из "всплывающего окна" справа от экрана, чтобы предотвратить использование символов "меньше" и "больше" в качестве HTML-тегов и отбрасывание всего кода...

NotPolitcallyCorrect

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

Ali Khan Xyz

я думаю, что сейчас это хорошо.

3 Ответов

Рейтинг:
8

Jochen Arndt

Используйте калькулятор для выполнения этих шагов вручную:


  1. log10 (1234) = 3,0913
  2. этаж (3,0913) = 3,0
  3. через PoW(10.0, 3.0) = 1000.0
  4. (unsigned int)1000,0 = 1000
  5. 1234 % 1000 = 234

Что касается операций см.
log10-ссылка на C++ [^]
floor-ссылка на C++ [^]
тяп - Справочник по c++ [^]
Тип литья (unsigned int): Преобразования типов - учебники по C++ [^]
Оператор по модулю %: Операторы-Учебники По C++ [^]


Jochen Arndt

Это типовой слепок. Правое значение имеет тип double (я указал на это, записав его как двойное значение с плавающей запятой с десятичной точкой".").
Это приведено к unsigned int, что означает, что цифры после десятичной точки игнорируются и присваивается целая часть значения с плавающей запятой.

См.также раздел "приведение типов" в ссылке "преобразования типов" из моего решения.

Ali Khan Xyz

я не понял Шаг 4. пожалуйста, объясните это немного. спасибо

Jochen Arndt

См. мой вышеприведенный комментарий. Это базовая функция C / C++. Вы можете посмотреть свои книги / учебники / уроки или поискать в google "C++ Type casting".

Ali Khan Xyz

Огромное спасибо!.

Рейтинг:
26

OriginalGriff

Все просто: оператор " % " - это модуль-он возвращает остаток от x при делении на y:

modulus = x % y
Таким образом, если x равно 123, а y-10, то модуль будет равен 3:
3 = 123 % 10
потому что 123, деленное на десять, - это 12, остаток 3.
В вашем коде ваш исходный номер id 1234, а делитель равен 1000 (проверьте математику, и это очевидно). Таким образом, в результате получается остаток от 1234 делится на 1000, что составляет 234


Ali Khan Xyz

У меня появилась идея. Спасибо

Рейтинг:
17

Kornfeld Eliyahu Peter

На самом деле это не имеет ничего общего с разработкой программного обеспечения, но гораздо больше тест, чтобы увидеть, как вы можете следовать чему-то и разбивать его на части...

// your line break into two
unisgned int d = (unsigned int)pow(10.0, (double)floor(log10(n)));
n = n % d; // this is a simple modulus (reminder after division) operator, and if n is 234 than d must be 1000

// the question how d became 1000!!!
// (unsigned int)pow(10.0, (double)floor(log10(n)))
// log10(1234) => 3.09123
// floor(3.09) => 3
// pow(10, 3) => 1000


Я бы сказал, что в любом случае вы не понимаете, казалось бы, сложного выражения, разбейте его на части...
Это хорошая практика, когда вы узнаете что-то новое или должны проанализировать какую-то проблему...


Ali Khan Xyz

А этот-классный.Спасибо