首页 > 解决方案 > 将一个数分解为素数的乘积并打印为 18=2*3^2

问题描述

我必须制作一个程序,将数字分解为素数并将其打印为 18=2*3^2

#include <stdio.h>
void decompose(int n);
unsigned checkprime(int i);

int main() {
    printf("100=");
    decompose(100);
    printf("1\n");
    return 0;
}

void decompose(int n) {
    int i;
    for (i=2; n>1; ++i) {
        if (checkprime(i) == 1 && n%i == 0) {
           n /= i;
           printf("%d*", i);
           i=1;
        }
    }
}

unsigned checkprime(int i) {
   if (i==1)
      return 0;
    for (int j=2; j<=i/2; j++) {
        if (i%j == 0)
            return 0;
    }
    return 1;
}

我想不出任何方法以正确的方式打印它

标签: cfunctionloopsprimesdefinition

解决方案


我们,初学者,应该互相帮助。:)

这个给你。

#include <stdio.h>

void decompose( unsigned int n )
{
    const unsigned int FIRST_PRIME = 2;

    printf( "%u = ", n );

    if ( n < FIRST_PRIME )
    {
        printf( "%u\n", n );
    }

    unsigned int m = FIRST_PRIME;

    while ( n > 1 )
    {
        unsigned int i = 0;

        while ( n % m == 0 )
        {
            ++i;
            n /= m;
        }

        if ( i != 0 )
        {
            printf( "%u", m );
            if ( i != 1 )
            {
                printf( "^%u", i );
            }

            if ( n != 1 ) putchar( '*' );
        }

        m = m == FIRST_PRIME ? 3 : m + 2;
    }
}


int main(void) 
{
    while ( 1 )
    {
        printf( "Enter a non-negative number (0 - exit): " );

        unsigned int n;

        if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

        putchar( '\n' );
        decompose( n );
        putchar( '\n' );
    }

    return 0;
}

程序输出可能如下所示

Enter a non-negative number (0 - exit): 1

1 = 1

Enter a non-negative number (0 - exit): 2

2 = 2

Enter a non-negative number (0 - exit): 3

3 = 3

Enter a non-negative number (0 - exit): 4

4 = 2^2

Enter a non-negative number (0 - exit): 5

5 = 5

Enter a non-negative number (0 - exit): 6

6 = 2*3

Enter a non-negative number (0 - exit): 7

7 = 7

Enter a non-negative number (0 - exit): 8

8 = 2^3

Enter a non-negative number (0 - exit): 9

9 = 3^2

Enter a non-negative number (0 - exit): 10

10 = 2*5

Enter a non-negative number (0 - exit): 11

11 = 11

Enter a non-negative number (0 - exit): 12

12 = 2^2*3

Enter a non-negative number (0 - exit): 13

13 = 13

Enter a non-negative number (0 - exit): 14

14 = 2*7

Enter a non-negative number (0 - exit): 15

15 = 3*5

Enter a non-negative number (0 - exit): 16

16 = 2^4

Enter a non-negative number (0 - exit): 17

17 = 17

Enter a non-negative number (0 - exit): 18

18 = 2*3^2

Enter a non-negative number (0 - exit): 19

19 = 19

Enter a non-negative number (0 - exit): 20

20 = 2^2*5

Enter a non-negative number (0 - exit): 0

至于您的代码,例如,即使该功能checkprime无效。它至少为数字 1 和 4 返回 1,但这些数字不是素数。:)

unsigned checkprime (int i){

    for (int j=2;j<i/2;j++) {
        if(i%j==0)
        return 0;
    }
  return 1;
}

推荐阅读