C语言中的整数分解

时间:2016-06-22 12:26:23

标签: c

我在C中创建一个程序,使输出看起来像这样:

2 = 2
3 = 3
4 = 2 x 2
5 = 5
6 = 2 x 3
....
102 = 2 x 3 x 17
103 = 103
104 = 2 x 2 x 2 x 13

我用以下方式编写了整数分解代码:

#include <stdio.h>
#define MAXNUM 1000

int main(){
int num,numfordiv;
int div = 2;
for (num=2;num<MAXNUM;num++){
    printf("%d=", num);
    numfordiv = num;
    if(num%div != 0){
        div = div+1;
    }
    else{
        numfordiv = numfordiv / div;
        printf("%d x ",div);
        if(numfordiv == 1){
            div = 2;
        }
    }
}
return 0;
}

然而,由于未知原因,这不起作用。循环有什么问题吗?

2 个答案:

答案 0 :(得分:3)

生成请求的输出所能做的至少是

#include <stdio.h>
#define MAXNUM 1000

int main()
{
    int num,numfordiv;
    int div = 2;
    for (num=2;num<MAXNUM;num++)
    {
        printf("%d= ", num);
        numfordiv = num;

        div = 2;

        while (numfordiv>1)
        {
            if(numfordiv%div != 0)
            {
                div++;
            }
            else
            {
                numfordiv /= div;
                printf("%d ",div);
                if(numfordiv != 1)
                {
                    printf("x ");
                }
            }
        }
        printf("\n");
    }
    return 0;
}

如您所见,您需要:

  1. 在所有可能的分隔线上循环的内循环
  2. 对于每个号码,您必须重置分隔符
  3. 必须对分割数
  4. 执行模运算

答案 1 :(得分:1)

@LP的答案很简单易懂。

但是,如果性能很重要,那么对于非常高的MAXNUM值存在缺陷。由于divwhile循环中仅增加1,因此对于高数字性能将是不好的,因为代码会测试很多将失败的div值。一个简单的例子:没有必要将div设置为4,6,8,10等。

下面是一个对高数字表现更好的例子。代价更复杂,内存使用更多。

基本思想是在检测到时填充素数并仅将div设置为素数值,以便代码跳过许多永远不会通过%测试的数字。

#include <stdio.h>
#include <stdlib.h>

#define MAXNUM 200000000
#define INCREASE_BY 1000

int main()
{
    // Make array for collecting primes
    int primes_array_size = INCREASE_BY;
    int *primes = malloc(primes_array_size * sizeof(int));
    if (primes == NULL)
    {
        printf("out of memory\n");
        return 0;
    }

    // Add 2 as the first prime
    primes[0] = 2;
    int num_primes = 1;
    int prime_pos = 0;

    int num,numfordiv;
    int div = 2;

    for (num=2;num<MAXNUM;num++)
    {
        div = primes[0];
        prime_pos = 0;

        printf("%d = ", num);
        numfordiv = num;

        while(numfordiv>1)
        {
            if(numfordiv % div != 0)
            {
                // Goto next prime (if there are any)
                ++prime_pos;
                if (prime_pos < num_primes)
                {
                    div = primes[prime_pos];
                }
                else
                {
                    // No more primes in the list
                    break;
                }
            }
            else
            {
                numfordiv = numfordiv / div;
                printf("%d",div);
                if (numfordiv != 1) printf(" x ");
            }
        }

        if (numfordiv != 1)
        {
            // Found new prime - add it
            primes[num_primes] = num;
            ++num_primes;
            printf("%d",num);

            if (num_primes == primes_array_size)
            {
                // Allocate more memory
                primes_array_size = primes_array_size + INCREASE_BY;
                int* tmp = realloc(primes, primes_array_size * sizeof(int));
                if (tmp == NULL)
                {
                    printf("out of memory\n");
                    free(primes);
                    return 0;
                }
                primes = tmp;
            }

        }

        printf("\n");
    }

    free(primes);
    return 0;
}