Давайте начнем с этого:
temp = a;
while(temp < n) {
if(temp%b != 0) {
count++;
}
temp += a;
}
temp = b;
while(temp < n) {
if(temp%a != 0) {
count++;
}
temp += b;
}
Далее рассмотрим некоторые читы.Если a%b == 0
, то любое число, кратное a
, также будет кратно b
;и аналогичные для b%a == 0
.В обоих случаях счет должен быть равен нулю.
Если a == 0
, то ни одно число не делится на a
;и аналогичные для b == 0
;и если оба a
и b
равны нулю, то счет должен быть равен нулю.
Наконец;не забывайте, что (в C) поведение x%0
не определено, и вам нужно остерегаться этого.
Комбинируя все вышеперечисленное, вы получаете что-то вроде:
if( (a == 0) && (b == 0) ) {
return 0;
}
if( (a != 0) && (b != 0) ) {
if( (a%b == 0) || (b%a == 0) ) {
return 0;
}
}
count = 0;
if(a != 0) {
temp = a;
while(temp < n) {
if(temp%b != 0) {
count++;
}
temp += a;
}
}
if(b != 0) {
temp = b;
while(temp < n) {
if(temp%a != 0) {
count++;
}
temp += b;
}
}
return count;
Следующий раунд читов:
- Если
n <= 1
, то число должно быть равно нулю. - Если
a == 1
или a == -1
, то все числа делятся на a
. - Если
b == 1
или b == -1
, то все числа делятся на b
.
Чтобы справиться с этим, я бы перешел к «вложенному переключателю», чтобы минимизировать числоветви, как:
switch(a) {
case 0:
switch(b) {
case 0:
...
break;
case -1:
case 1:
...
break;
default:
...
break;
}
break;
case -1:
case 1:
switch(b) {
case 0:
...
break;
case -1:
case 1:
...
break;
default:
...
break;
}
break;
default:
switch(b) {
case 0:
...
break;
case -1:
case 1:
...
break;
default:
...
break;
}
break;
}