Использование модуля для отрицательных значений
Я хочу обернуть случайное число с помощью модуля, так что значения, превышающие 11, начинаются с 0 и больше. Однако я также хотел бы, чтобы числа, меньшие 0, делились на 11 или меньше.
Поправьте меня, если я ошибаюсь, но насколько я могу судить, оператор остатка делит только на значения, превышающие делитель. Если так, как написать код, который также делит на значения, меньшие 0?
@Erik, 👍0
2 ответа
Лучший ответ:
Один грубый способ:
while (x > 11) x -= 11;
while (x < 0) x += 11;
Первую операцию можно заменить на операцию по модулю.
Просто используйте остаток
#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
- Округление числа с плавающей запятой
- Как отфильтровать или исключить показания магнитного поля Земли вокруг 3D-магнитного датчика?
- Какая должна быть частота среза?
- Проблема с увеличением ШИМ с течением времени
- Насколько точны вычисления в stm32?
- Неожиданное поведение с расчетом Arduino Uno
- Как сопоставить целые значения и округлить их до десятков/тысяч?
- Как выполнять команды в течение желаемого периода времени
Спасибо за ваш отзыв. Однако, похоже, это дает другой результат, чем тот, который я просил., @Erik
Если значение отрицательное, добавьте 11., @Gerben
исправлено по предложению @Gerben, @gilhad