Деление целых чисел - PullRequest
       1

Деление целых чисел

5 голосов
/ 01 февраля 2011

Я знаю, что при делении целых чисел по умолчанию, как это работает, отбрасывать дробную часть. Например,

int i, n, calls = 0;
n = 1;
n /= 3;
printf("N = %i\n", n);
for (i = 1; i > 0; i /= 3) {
    calls++;
}
printf("Calls = %i\n", calls);

Код, указанный выше:

N = 0
Calls = 1

Не могли бы вы объяснить это поведение?

Ответы [ 7 ]

14 голосов
/ 01 февраля 2011

1, деленное на 3 = .3333 (повторяя, конечно), математически. Вы можете думать о компьютере как об урезании .3333, так как он выполняет целочисленную арифметику (0 Остаток 1).

Цикл for выполняется, потому что i = 1 и 1 > 0. После выполнения тела цикла вы делите i на три, а i становится 0, что не больше 0.

3 голосов
/ 01 февраля 2011

переписать как while и это станет очевидным.

i = 1;
while ( i > 0 )
{
    calls++;        
    i /= 3; //This becomes .3333, which truncates to zero
}
1 голос
/ 01 февраля 2011

В чем проблема? Первая строка вывода является немедленной: 1/3 = 0,33333 ..., удаляя дробную часть это 0.

Для второй строки помните, что цикл for переводится примерно так:

i=1;
while(i>0)
{
    calls++;
    i/=3;
}

Итак, при запуске i равно 1; первая итерация while выполняется, потому что i, будучи 1, больше 0. calls равно 0 и увеличивается на 1, таким образом, получается 1. i делится на 3, поэтому до 0 (потому что дробная часть не вычисляется в целочисленном делении). Проверка состояния while выполняется снова, но теперь i равно 0, поэтому цикл не повторяется. calls остается равным 1, и это значение выводится на экран.

1 голос
/ 01 февраля 2011

Поскольку цикл выполняется один раз.

Приращение цикла в for выполняется после тела цикла, и при входе в цикл i > 0 имеет значение true как 1 > 0, при следующем делении цикла происходит, а затем тест становится ложным выход из цикла.

0 голосов
/ 01 февраля 2011

Поскольку в целочисленной арифметике ответ на 1, деленный на 3, равен 0 с остатком от 1. Если вы разделите два целых числа, вы получите целочисленную арифметику.Если вам нужна арифметика с плавающей запятой, вам нужно, чтобы хотя бы один из операндов был значением с плавающей запятой.

0 голосов
/ 01 февраля 2011

n - это int, деление вернет целое число, а не double или float

0 голосов
/ 01 февраля 2011

Все очень просто.

int i, n, calls = 0; // Set calls to 0
n = 1;               // n is now 1
n /= 3;              // n /= 3 = 1/3 = 0
printf("N = %i\n", n);
for (i = 1; i > 0; i /= 3) { // 1/3 = 0
    calls++;                 // runs once
}                            
printf("Calls = %i\n", calls);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...