Как удалить первый * мой вывод в программе на C? - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь написать программу, которая выводит простые множители заданного числа, но мне нужно распечатать их, разделенные на *, например: для ввода 100 вывод будет: 2 * 2 * 5* 5, есть предложения?я сделал это до сих пор:

# include <stdio.h> 
# include <math.h> 

void decomposicao(int n) 
{ 
    printf("%d = ", n);

    while (n%2 == 0) 
    { 
        n = n/2;
        printf("* %d ", 2); 
    } 

    for (int i = 3; i <= sqrt(n); i = i+2) 
    { 
        while (n%i == 0) 
        { 
            n = n/i; 
            printf("* %d ", i);     
        } 
    } 

    if (n > 2) 
        printf ("* %d ", n); 

} 
int main() 
{ 
    int n;

    scanf("%d", &n);

    if (n<=0||n==1)     
    {   
        printf("Error", n);
    }
    else
    {
        decomposicao(n);
    }   

    return 0; 
}

Для этого кода вывод:

100 = *2*2*5*5

Ответы [ 2 ]

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

Во-первых, вы можете изменить способ * печати.Вместо того, чтобы просить вашу строку, просто поместите ее в конец.

Теперь, вместо того, чтобы записывать результаты непосредственно в выходной поток, вы можете записать во внутренний буфер, а когда вы закончите, простоигнорируйте два последних символа в нем.

void decomposicao(int n) 
{ 
    const size_t len = 512;
    char buffer[len];
    size_t written = 0;

    written = snprintf(buffer, len, "%d = ", n);

    while (n%2 == 0) 
    { 
        n = n/2;
        written += snprintf(buffer + written, len - written, "%d * ", 2); 
    } 

    for (int i = 3; i <= sqrt(n); i = i+2) 
    { 
        while (n%i == 0) 
        { 
            n = n/i; 
            written += snprintf(buffer + written, len - written, "%d * ", i);     
        } 
    } 

    if (n > 2) 
        written += snprintf(buffer + written, len - written, "%d * ", n); 

    buffer[len - 1] = '\0';
    buffer[written - 2] = '\0';
    printf("%s\n", buffer);

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

Добавьте логическую переменную, которая сообщает вам, печатаете ли вы первый фактор или нет.

#include <stdbool.h>

void decomposicao(int n) 
{ 
    bool first = true;
    printf("%d = ", n);

    while (n%2 == 0) 
    { 
        n = n/2;
        if (!first)
            printf("* ");

        printf("%d ", 2); 
        first = false;
    } 

    for (int i = 3; i <= sqrt(n); i = i+2) 
    { 
        while (n%i == 0) 
        { 
            n = n/i; 
            if (!first)
                printf("* ");

            printf("%d ", i);
            first = false;  
        } 
    } 

    if (n > 2) {
        if (!first)
            printf("* ");

        printf ("%d ", n); 
    }
} 
...