Можно ли купить k шариков мороженого ,если его продают по 3 и по 5 шариков? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задача : "В кафе мороженое продают по три шарика и по пять шариков. Можно ли купить ровно k шариков мороженого?" Ссылка на нее - http://informatics.mccme.ru/mod/stat...hapterid=264#1 . Методом "листик, бумажка и сто двадцать запусков программы" я- таки подобрал все условия,которые как минимум удовлетворяют условиям тестов:
#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);
}
Но вот меня интересует, можно ли короче? И все ли я вообще учел? (Там всего 13 тестов, как-то неубедительно это.)

Решение задачи: «Можно ли купить 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;
}

Объяснение кода листинга программы

  1. Объявлены переменные: a=3, b=5, i, x, flag=0, n.
  2. В цикле от a до 100 вычисляется возможность покупки n шариков мороженого.
  3. Если n делится на a без остатка, то выводится сообщение о покупке n раз по a шариков мороженого.
  4. Если n не делится на a без остатка, то вычисляется остаток x, который должен делиться на b без остатка.
  5. Если x делится на b без остатка, то выводится сообщение о покупке n раз по a шариков мороженого и (x/b) раз по b шариков мороженого.
  6. Если x не делится на b без остатка, то в цикле проверяется остаток (n-a*i), где i - это число от 1 до n/a.
  7. Если (n-a*i) делится на b без остатка, то выводится сообщение о покупке n раз по a шариков мороженого и (x/b) раз по b шариков мороженого.
  8. Если (n-a*i) не делится на b без остатка, то проверка продолжается для следующего числа i.
  9. Если n делится на b без остатка, то выводится сообщение о покупке n раз по b шариков мороженого.
  10. Если flag не равно 1, то выводится сообщение No.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы