2016-06-15 13 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,找到你三三兩兩先放數(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; 
}