2016-09-13 5 views
-6

Меня попросили написать функцию void в c (no loops), которая получает четное число (скажем, 80) и печатает его следующим образом: 2 * 2 * 5 * 2 * 2 Как видите, результат равен 80 лол. Между двумя номерами вам нужно напечатать «*», а нечетное число (для моего примера, 5) вам нужно распечатать его посередине или если в номере есть нечетные числа «2», скажем 96 вам нужно напечатать его так: 2 * 2 * 2 * 3 * 2 * 2 Если заданное число нечетное, верните номер. Я бы хотел получить не только ответ, но и то, как вы «думаете», прежде чем начинать код. Вот что я получил до сих порФактор в C-рекурсии

if(n%4==0) 
{ 
    printf("2*"); 
    PrintTwos(n/4); 
    return; 
} 
if(n%2==0) 
{ 
printf("*2"); 
PrintTwos(n/2); 
    return; 
    } 
    printf("%d",n); 
+2

Как вы это сделаете (с ручкой и бумагой)? Что вы пытаетесь закодировать до сих пор? – purplepsycho

+1

Показать код! – vz0

+0

Прежде всего, подумая о состоянии стоп. Позволяет сказать, если число нечетное. Но моя главная проблема заключается в том, чтобы понять, как я могу напечатать свой номер таким образом, чтобы мой странный фактор (5, извините, если это не правильное слово для него) появится посередине, а не в end – user6788452

ответ

2

вот некоторые псевдо-код:

func(nbr) 
    isOdd(nbr)   // recursive stop condition 
    print nbr 
    return 

    evenNbr = findFirstEven(nbr) //return the shortest even number from nbr 
    print evenNbr 
    func(nbr/evenNbr) 

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

EDIT следующие комментарии: (NOT COMPLETE: нечетное число в середине отсутствует в этом)

int findFirstEven(nbr, i) { 
    if (nbr%i != 0) 
     return findFirstEven(nbr, i++); 
    return i; 
} 

int primefact(int n) 
{ 
    int i=2; 
    i = findFirstEven(n, i); 

    printf("%d*", i); 
    if(n==i) 
     printf("1"); 
     return 0; 
    else 
     primefact(n/i); 
} 

(не проверено)

+0

Могу ли я добавить решение этой проблемы и помочь мне понять, что там происходит? – user6788452

+0

Вы не хотите искать немного? это школьное упражнение? Если да, то цель состоит в том, чтобы думать самостоятельно. У вас почти все здесь. Но если вы действительно не хотите ... нормально ... –

+0

вам нужно что-то сделать, чтобы найти простое число. Вы не можете продолжать ставить «если» для всех простых правых. Давайте теперь отредактируем главный пост. –

1

Вы должны распространять 2-х пополам, так что вам нужно удалить два двое из числа до рекурсивного шага - в противном случае рекурсивный шаг должен был бы знать, насколько глубоко он должен печатать слишком много двойки с левой стороны.
Конечно, вы должны проверить, действительно ли два двое!

Итак:

void PrintTwosInNumber(unsigned n) 
{ 
    if(n % 4 == 0) 
    { 
     printf("2*"); 
     PrintTwosInNumber(n/4); 
     printf("*2"); 
    } 
    else if(n % 2 == 0) 
    { 
     printf("2*"); 
     PrintTwosInNumber(n/2); 
    } 
    else 
     printf("%u", n); 
} 

Вы можете сохранить последний рекурсивный шаг с

void PrintTwosInNumber(unsigned n) 
{ 
    if(n % 4 == 0) 
    { 
     printf("2*"); 
     PrintTwosInNumber(n/4); 
     printf("*2"); 
    } 
    else if(n % 2 == 0) 
     printf("2*%u", n/2); 
    else 
     printf("%u", n); 
} 

Edit:

Пожалуйста, обратите внимание, что функция будет падать в бесконечную рекурсию для n==0 - ноль бесконечно делится на 2. Однако ноль может не быть представлен как произведение любого количества 2 и некоторых нечетных чисел, поэтому он выходит за рамки этой проблемы.
В любом случае, если это была задача программирования real, нужно учитывать этот особый случай и добавить ветвь защиты if(n==0) return;, чтобы быть в безопасности, если вызывающий абонент передает неправильное значение параметра.

+0

Очень элегантное решение! – Xaver

 Смежные вопросы

  • Нет связанных вопросов^_^