Можно ли купить 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д