Определить, каким наименьшим количеством денежных купюр можно выплатить сумму N - C (СИ)

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

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

В некоторой стране используются денежные купюры достоинством в 1,2,4,8,16,32 и 64.дано натуральное число N.Как наименьшим количеством таких денежных купюр можно выплатить сумму N(указать количество каждой из используемых для выплаты купюр)? Предлагается, что имеется достаточно больше количество купюр всех достоинство. Решить можно только с использованием циклов и разветвляющихся операторов. Мне очень не нравится моё решение. Подскажете как исправить? Суть моего решения: уменьшаем число до значения<64, затем, переводим его в двоичную систему и далее смотрим какой разряд в этом числе равен 1, что является признаком того, что купюра номинала 2^i(где i - номер разряда) была выдана.
#include <stdio.h>
#include <math.h>
int main()
{
int n, um, k64; //само число\уменьшаемое значение равное n\ счетчик для купюр номиналом 64.
int raz, kf,i,two,mod; /*число меньшее 64 записанное в двоичной форме
\коэффициент равный степеням 10\счетчик разрядов двоичного числа\степени двойки\
переменная перебора разрядов двоичного числа*/
printf("Input n: ");
scanf("%d",&n);
um = n;
k64=0;
kf = 1;
raz=i=0;
if (n>=64) 
    while (um>=64)
    {
        um=um-64;
        k64++;
    }
if (um<64&um>=1) 
    while (um>0)
    {   
        raz =raz+um%2*kf;
        um = um/2;
        kf=10*kf;
    }
kf = 10;
while (raz>0)
{
    mod=raz%kf;
    if (mod==1)
    {
        two = pow(2,i);
        printf("\n%d - 1",two);
    }
    raz= raz/10;
    i++;
}
printf("\n64 = %d",k64);
return 0;
}

Решение задачи: «Определить, каким наименьшим количеством денежных купюр можно выплатить сумму N»

textual
Листинг программы
#include <stdio.h>
 
main() {
  int n, m;
  printf ("N= "); scanf ("%d", &n);
  for (m= 64; m > 0; m/=2) {
    if (n/m) printf ("%d - %d times\n",  m, n/m);
    n%=m;
  }
}

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

В этом коде:

  1. Сначала объявляются две переменные типа int — n и m.
  2. Затем пользователю предлагается ввести число N.
  3. После этого начинается цикл for, который выполняет следующие действия: — Проверяет, делится ли N на текущее значение m без остатка. — Если делится, то выводит на экран количество раз, которое m встречается в числе N. — Затем значение m присваивается переменной n %= m; — Цикл выполняется до тех пор, пока m больше 0.
  4. В конце цикла значение переменной m будет равно 1, и оно будет соответствовать минимальному количеству денежных купюр.

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


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

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

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