Можно ли купить k шариков мороженого ,если его продают по 3 и по 5 шариков? - C (СИ)
Формулировка задачи:
Задача : "В кафе мороженое продают по три шарика и по пять шариков. Можно ли купить ровно k шариков мороженого?"
Ссылка на нее - http://informatics.mccme.ru/mod/stat...hapterid=264#1 .
Методом "листик, бумажка и сто двадцать запусков программы" я- таки подобрал все условия,которые как минимум удовлетворяют условиям тестов:
Но вот меня интересует, можно ли короче? И все ли я вообще учел? (Там всего 13 тестов, как-то неубедительно это.)
#include <stdio.h>
int main(void)
{
long int kumber;
scanf("%ld", &kumber);
if ((kumber==2) || (kumber == 1) || (kumber == 4) || (kumber == 7))
printf("NO");
else
if ((kumber % 3 == 0) || (kumber % 5 == 0) || ((kumber % 8) == 0) || ((kumber - 8) % 3 == 0) || ((kumber - 3) % 5 == 0) || ((kumber - 5) % 3 == 0) || ((kumber - 8) % 5 == 0) || ((kumber - 3) % 8 == 0 || ((kumber - 5) % 8 == 0))|| ((kumber - 6) % 5 == 0))
printf("YES");
else
printf("NO");
return(0);
}Решение задачи: «Можно ли купить k шариков мороженого ,если его продают по 3 и по 5 шариков?»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 3, b = 5, i, x, flag = 0, n;
//puts("Enter number > 2:");
for(n = a; n < 100; n++){
printf("%d =", n);
flag = 0;
//while(!scanf("%d", &n))
//puts("Error input!Try againt.");
if(n % a == 0){
printf(" %d times with %d scoops of ice-cream.\n", n / a, a);
flag = 1;
//return 0;
}
else{
x = n % a;
if(x % b == 0){
printf(" %d times with %d scoops and %d times with %d scoops of ice-cream.\n",
n / a, a, x / b, b);
flag = 1;
//return 0;
}
else{
for(i = 1; i <= n / a; i++)
if((n - a * i) % b == 0){
if(flag)
printf(" Or %d times with %d scoops and %d times with %d scoops of ice-cream.\n",
(n - a * i) / b, b, i, a);
else{
printf(" %d times with %d scoops and %d times with %d scoops of ice-cream.\n",
(n - a * i) / b, b, i, a);
flag = 1;
}
//return 0;
}
}
}
if(n % b == 0){
if(flag)
printf(" Or %d times with %d scoops of ice-cream.\n", n / b, b);
else{
printf(" %d times with %d scoops of ice-cream.\n", n / b, b);
flag = 1;
}
//return 0;
}
if(!flag)
puts(" No.");
}
return 0;
}
Объяснение кода листинга программы
- Объявлены переменные: a=3, b=5, i, x, flag=0, n.
- В цикле от a до 100 вычисляется возможность покупки n шариков мороженого.
- Если n делится на a без остатка, то выводится сообщение о покупке n раз по a шариков мороженого.
- Если n не делится на a без остатка, то вычисляется остаток x, который должен делиться на b без остатка.
- Если x делится на b без остатка, то выводится сообщение о покупке n раз по a шариков мороженого и (x/b) раз по b шариков мороженого.
- Если x не делится на b без остатка, то в цикле проверяется остаток (n-a*i), где i - это число от 1 до n/a.
- Если (n-a*i) делится на b без остатка, то выводится сообщение о покупке n раз по a шариков мороженого и (x/b) раз по b шариков мороженого.
- Если (n-a*i) не делится на b без остатка, то проверка продолжается для следующего числа i.
- Если n делится на b без остатка, то выводится сообщение о покупке n раз по b шариков мороженого.
- Если flag не равно 1, то выводится сообщение
No.