C/C++

Задача на С++ Остатки, помогите пожалуйста понять, что не так.

Даны целые неотрицательные числа a, b, c, d, при этом 0≤c<d. Выведите в порядке возрастания все числа от a до b, которые дают остаток c при делении на d.

В этой задаче нельзя использовать инструкцию if, должен быть только один цикл.

Входные данные

На вход подаются четыре строки, в каждой из которых написано по одному неотрицательному целому числу — a, b, c, d. Все числа не превосходят 2∗109, 0≤c<d.

Выходные данные

Выведите ответ на задачу.

Примеры
ввод: 5 5 0 5
вывод: 0
#include <iostream>

using namespace std;

int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
a=a-c;
b=b-c;
int v=a+d-1;
a=v/d*d;
for (int i = a; i <= b; i += d){
cout << i << " ";}
return 0;
}
что-то не въехал в математику.
предлагаю так:
a/=d;// частное от деления
a*=d;// a без остатка
a+=c;// a с остатком
дальше цикл.
Нюанс - в условии не написано, что a<=b, надо это обеспечить.
Вопрос: почему в примере "вывод: 0"?
Анатолий Жиганов
Анатолий Жиганов
25 516
Лучший ответ
У тебя 2 варианта:
a % d <= c - в этом случае надо начинать цикл со значения (a / d) * d + c
a % d > c - в этом случае надо начинать цикл со значения (a / d + 1) * d + c

Код:

cin >> a >> b >> c >> d;
for (int i = (a / d + (a % d > c)) * d + c; i <= b; i += d) { cout << i << ' '; }
Мне известен один способ разместить границы диапазона в переменных a и b так, чтобы значение переменной a гарантированно стало меньше или равным значению переменной b.

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

Для краткости обозначу этот массив так: int t[2];

Ввод будет таким: вместо cin >> a >> b >> c >> d; станет cin >> t[0] >> t[1] >> c >> d;

А теперь главное!

a = t[ t[0] > t[1] ];
b = t[ t[0] < t[1] ];

И НИКАКИХ IF
Александр Макеев Используется автоматическое преобразование логического типа в числовой. То есть true → 1, false → 0. Это используется в качестве индекса в массиве.
Александр Макеев Совет: используйте тип long
Александр Макеев А, вот оно что!

Оказывается, задача с Сириуса!

Но, по-моему, у тех, кто составлял эту задачу, не все дома... То есть не всё в порядке с логикой.

Я умываю руки. Ищите правильный (хм!!!) ответ на КиберФоруме.