2011-01-17 3 views
0

Если бы кто-нибудь мог ответить мне, почему это работает, было бы весьма полезно. Упражнение (глава 4, из 7 и 8) гласит, что если у вас есть выражение: 9 - ((всего - 1)% 10) , тогда у вас может возникнуть соблазн упростить его следующим образом: 10 - (всего% 10) Но это не сработало. Вместо этого он предлагает альтернативу: (10 - (всего% 10))% 10Упражнение в «Программирование на C: современный подход»

Теперь я понимаю, как он добрался до первого упрощения, но не почему это неправильно или почему работает второй.

Заранее спасибо

+2

Каким образом «альтернативное» упрощение !? Он имеет такое же количество операндов и операторов, что и оригинал, и в большинстве случаев оператор '%' дороже, чем '-'. Я не знаю эту книгу, но если это было хорошо, это объясняется в тексте? – Clifford

+0

Это упражнение. Вы должны сказать, почему первое «упрощение» неверно, и если второе будет работать. Книга просто дает ответы на некоторые упражнения. –

ответ

3

Рассмотрим выходы для total = 10 видеть, что второе выражение не является эквивалентом.

Заметим также, что третье выражение не эквивалентно первому выражению, если total > 0 (поскольку поведение % является реализация определенных в предварительном C99 C, и определено, но не то, что вы хотите в С99).

Предполагая, что total > 0, первое и третье выражения эквивалентны из-за следующей математической идентичности:

(a % b) == (((a + c) % b) - c) % b 

Чтобы понять, почему, представьте себе, делать операции на циферблате.

+0

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

+0

@Facu: 'a = (total-1)', 'b = 10',' c = 1'. –

+0

Ohhhhhhhhhhhhhh теперь я понимаю !!! большое спасибо! –

1

Это потому, что по модулю в C допускается отрицательное число.

так -5% 10 -5 вместо 5.

В первом случае, 9 - ((всего - 1)% 10) всегда положительна.

Во втором случае это может быть отрицательным, если -10 < всего < 0. В третьем случае оно снова обернуто для негативов обратно в положительный диапазон.

Это обычное явление для модуляции, потому что обычно вы хотите его только для положительных результатов (не знаете, почему они реализовали его для негативов).

+0

@ AbstractDissonance - вы уверены в этом? У меня создалось впечатление, что спецификация C оставила поведение модуля с отрицательными значениями неопределенными. – templatetypedef

+0

Собственно, результат определяется реализацией. –

+0

Прошу прощения, но не могли бы вы объяснить шаги, которые нужно предпринять с 9 - ((всего - 1)% 10) до (10 - (всего% 10))% 10? Это то, чего я не понимаю –

0

Чтобы показать, почему 9 - ((всего)% 10) неверно, используйте противоречие.

Пусть total = 10.

Тогда 9 - ((10-1)% 10) ==> 9- (9% 10) ==> 9-9 = 0.

Но, 10- (10% 10) ==> 10 -0 = 10.

Таким образом, 10 - ((всего)% 10) не эквивалентно 9 - ((общая-1)% 10)

4

x% m имеет диапазон (-m, m) в большинстве реализаций C. Математически это обычно определяется из (0, m). Следовательно, добавив m, модуль снова преобразует C в математический.

0

Альтернатива не является упрощение и ни выражение будут сброшены первым, так что помещение имеет недостатки с самого начала:

следующее:

int total ; 
for(total = -10; total <= 10; total++) 
{ 
    printf("%d:\t%d\t%d\t%d\n", total, 
           9 - ((total - 1) % 10), 
           10 - (total % 10), 
           (10 - (total % 10)) % 10) ; 
} 

производит:

-10: 10  10  0 
-9:  9  19  9 
-8:  18  18  8 
-7:  17  17  7 
-6:  16  16  6 
-5:  15  15  5 
-4:  14  14  4 
-3:  13  13  3 
-2:  12  12  2 
-1:  11  11  1 
0:  10  10  0 
1:  9  9  9 
2:  8  8  8 
3:  7  7  7 
4:  6  6  6 
5:  5  5  5 
6:  4  4  4 
7:  3  3  3 
8:  2  2  2 
9:  1  1  1 
10:  0  10  0 

Последний является только равным для целых чисел, больших нуля.

+0

Извините, я забыл рассмотреть контекст упражнения. Всего больше нуля, всегда. Я просто не понимаю, почему первое и третье выражения эквивалентны для total> 0 –

+0

@Facu T: Это цель книги, чтобы научить вас программированию или математике? – Clifford

+0

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

Смежные вопросы