Выведите число с заданной длиной и суммой - PullRequest
0 голосов
/ 25 сентября 2019

Я должен сделать программу на C, которая принимает целые числа, sumOfDig и lengthOfNum.sumOfDig равно сумме цифр, а lengthOfNum равно длине числа.Мне не разрешено использовать массивы или math.lib

1 ≤ sumOfDig ≤ 81 и 1 ≤ lengthOfNum ≤ 9

Я пытался написать цикл while, но не могу вспомнитьспособ, которым можно построить число и вычесть последнее добавленное число из суммы чисел.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int lengthOfNum;     /* stores the length of the number       */
    int sumOfDig;        /* stores the sum of the digits          */
    int ans;             /* stores the answer                     */

    scanf("%d", &sumOfDig);     /* scans the sum of the digits    */
    scanf("%d", &lengthOfNum);  /* scans the length of the number */

    ans=0;     /* initializes ans */

    /* adds a number to ans, and removes it from sumOfDig */
    while(sumOfDig!=0 && lengthOfNum!=0) {
        /*???*/

        lengthOfNum--;
    };

    printf("%d\n", ans);     /* prints the outcome */

    return 0;
}

Следующие данные должны быть входными и выходными:

In: 20 2 Out:Невозможно

Вход: 20 3 Выход: 992 (длина равна 3 и 9 + 9 + 2 = 20)

Вход: 50 8 Выход: 99999500 (длина равна 8 и9 + 9 + 9 + 9 + 9 + 5 + 0 + 0 = 50)

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Давайте назовем сумму цифр S и заданную длину L.

Сначала нам нужно проверить, есть ли решение.Минимальное количество цифр, которое нам нужно, будет зависеть от того, сколько раз 9 делится на S.

  1. Найдите, как раз 9 делится на S. Давайте назовем это Q.
  2. Найдите остаток отвышеупомянутое разделение.Давайте назовем это R.
  3. Если R равно 0,
    1. Если L меньше Q,
      1. Нет решения.
  4. Иначе,
    1. Если L меньше Q + 1,
      1. Нет решения.

Теперь мы можем произвести вывод.

  1. Выход Q 9 с.
  2. Если R не равно 0,
    1. Выход R.
    2. Выход LQ-1 0.
  3. Остальное
    1. Выход LQ 0.

или

  1. Выход Q 9 с.
  2. Установите Z на LQ.
  3. Если R не равно 0,
    1. Выход R.
    2. Уменьшение Z.
  4. Выход Z 0.

Существуют и другие подходы.Вы могли бы избежать проверки входных данных, сначала построив выходные данные в буфере - или даже в int - но я использовал тот, который легко визуализировать и следует часто требуемому соглашению проверки перед вычислением.

Делениеможет быть выполнено в виде цикла, и это дает вам основу для альтернативных подходов, которые я упомянул.

unsigned R = S;
unsigned Q = 0;
while (R > 9) {
   R -= 9;
   ++Q;
}
0 голосов
/ 25 сентября 2019

Я даю подсказку, а не полное решение.

  • Поймите, что может быть много правильных ответов для данной суммы цифр и длины.
  • Используемый алгоритмвыводить 9 всегда, пока сумма оставшихся цифр не станет меньше 9.

Алгоритм приведен ниже.

  • Если сумма цифр> len * 9 ->вывод невозможен -> конец
  • Цикл по цифрам.
    • Если sum_digits> = 9, -> выходной символ 9, -> использовать подсказку printf ("9");
      • уменьшить sum_digits на 9.
    • иначе выходной символ (sum_digits) -> использовать printf ("%c",sum_digits+'0');
      • установить sum_digits в 0.
...