2016-06-15 3 views
1

Я пытаюсь найти простые множители положительного числа и отделить их от «*», моя функция работает, иногда она печатает две звезды вместо одной. 2*2**3Отображать простые множители положительного числа, разделенные «*» в c

void ft_prime(int n) 
{ 
    int i; 
    int y; 

    i = 3; 
    y = 0; 
    while (n % 2 == 0) 
    { 
     ft_putnbr(2); 
     ft_putchar('*'); 
     y = 1; 
     n = n/2; 
    } 
    while (i <= ft_sqrt(n)) 
    { 
     while(n % i == 0) 
     { 
      if (y) 
       ft_putchar('*'); 
      ft_putnbr(i); 
      y = 1; 
      n = n/i; 
     } 
     i += 2; 
    } 
    if (n > 2) 
    { 
     ft_putchar('*'); 
     ft_putnbr(n); 
    } 
} 
+1

В первом цикле вы печатаете число, за которым следует звезда. Во втором цикле вы печатаете звезду, за которой следует номер. Вы должны сделать первый цикл точно таким же, как во втором цикле. – user3386109

+0

@ user3386109, если я это сделаю, я получаю хвост '*', например '2 * 2 * 3 *' –

+0

добавляет условие, которое только печатает завершающий '*', если есть остающиеся факторы –

ответ

1

Когда вы делите на два, чтобы найти кратные двоек сначала поставить номер (2), то звездочка. Внутри while (i <= ft_sqrt(n)) для поиска остальных простых чисел вы сначала печатаете звездочку, а затем номер.

Почему у вас даже есть первое время?

Если вы пропустили это, это главный вопрос. Причина поиска первого штриха, отдельного от других, заключается в том, что вы не печатаете звездочку в первый раз. На StackOverflow нам не нравится делать домашние задания других людей, но вот ведущий:

Ваш код должен выглядеть:

  • Найти первый делитель (который может или не может быть 2) и распечатать его.
  • Найдите остальные разделители до ft_sqrt(n) (если есть) и напечатайте '*', затем простое.
  • Сделки с остатком и либо напечатать звездочку, либо нет в зависимости от того, напечатали ли вы что-нибудь (подсказка: что в вашем коде есть y?).

Хороший дизайн потребует функции для поиска следующего разделителя.

1

Поскольку у меня нет других функций ft_, я пишу пример, просто использую putchar, вы можете попробовать изменить свою собственную функцию следующим образом.

#include <stdio.h> 
#include <stdbool.h> 

void ft_prime(int n) 
{ 
    int i; 
    bool separated; 

    separated = false; 
    while (n % 2 == 0) { 
     if (separated) 
      putchar('*'); 
     putchar('2'); 
     n /= 2; 
     separated = true; 
    } 

    i = 3; 
    while (i <= n) { 
     while (n % i == 0) { 
      if (separated) 
       putchar('*'); 
      putchar(i+'0'); 
      n /= i; 
      separated = true; 
     } 
     i += 2; 
    } 
} 

int main(void) 
{ 
    ft_prime(12); 
} 

Выход

2*2*3 

Надеется, что это помогает.

1

В вашей логике, первый цикл: (2*)(2*), второй цикл: (*3), поэтому выход (2*)(2*)(*3)

Чтобы изменить ее, изменить первой петли, чтобы логика, как (2) (* 2) (* 2) ...

while (n % 2 == 0) 
{ 
    if(y==1){ 
     ft_putchar('*'); 
    } 
    ft_putnbr(2); 
    y = 1; 
    n = n/2; 
} 
Смежные вопросы