Использование модуля для отрицательных значений

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

Поправьте меня, если я ошибаюсь, но насколько я могу судить, оператор остатка делит только на значения, превышающие делитель. Если так, как написать код, который также делит на значения, меньшие 0?

, 👍0


2 ответа


Лучший ответ:

1

Один грубый способ:

while (x > 11) x -= 11;
while (x < 0) x += 11;

Первую операцию можно заменить на операцию по модулю.

,

2

Просто используйте остаток

#include <stdio.h>

int main(){
   for (int i = -23;i<23;i++) printf("%d    %d\n",i,i%11);
   return 0;
}

все современные варианты C должны работать одинаково https://en.wikipedia.org/wiki/Modulo_operation (результат имеет тот же знак, что и делимое):

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

для новой формулировки запроса, исправленного по предложению @Gerben

если вам нужны монотонные последовательности 0..10, добавьте 11, если результат отрицательный:

#include <stdio.h>

int main(){
for (int i = -23;i<23;i++)
    {
    int x= i%11 ;
    x += x<0?11:0;
    printf("    %d  %d\n",i,x);
    };
return 0;
}

результаты в

-23 10
-22 0
-21 1
-20 2
-19 3
-18 4
-17 5
-16 6
-15 7
-14 8
-13 9
-12 10
-11 0
-10 1
-9  2
-8  3
-7  4
-6  5
-5  6
-4  7
-3  8
-2  9
-1  10
0   0
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10  10
11  0
12  1
13  2
14  3
15  4
16  5
17  6
18  7
19  8
20  9
21  10
22  0
,

Спасибо за ваш отзыв. Однако, похоже, это дает другой результат, чем тот, который я просил., @Erik

Если значение отрицательное, добавьте 11., @Gerben

исправлено по предложению @Gerben, @gilhad