素数因子化+ C中的素数

时间:2016-07-05 05:23:30

标签: c

我已被指派为复合数字进行素数因子分解,但问题是我已将其硬编码直到素数:2,3,5,7,11,13,19我想做到一般

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

void prime(int flag,int num);
int main()
{
    int num, flag, i, div;
    printf("Enter your number: ");
    scanf("%d", &num);
    flag = 1;
    prime(flag, num);
    printf("Press any key to exit.");
    getchar();
    return 0;
}

void prime(int flag, int num)
{
    void factor(int num, int i);
    int sq, i, square; 
    sq = abs(sqrt(num));

    if (num == 2)
          flag = 1;  
    else
        for (i = 2; i <= sq; i++)
     {
         if (num % i == 0)
         {
             flag = 0;
             break;
         }
         else
             flag = 1;
     }
    if (flag == 1)
        printf("\n%d is a prime number", num);
    else
    {
        printf("\n%d is not a prime number\n", num);
        factor(num, i);
    }
}      

void factor(int num, int i)
{
    for (i = 2; i <= num; i++)
    {
        again:
        if(num % i == 0)
       {
           num = num / i;
           printf("%d x", i);
           if (num != (2||3||5||7||11||17||19))
               goto again;              
       }   
    }
    printf("1\n\n");
}

P.S.:尽量让它变得更简单。 问题是在用最小的素数除以之后。即2,下一步应检查数字是否为素数。如果没有,那么将其分解,但我不知道该怎么做。 Plz的帮助。 Thx提前。

3 个答案:

答案 0 :(得分:1)

#include <stdio.h>

void factor(int num);

int main(void){
    int num;

    printf("Enter positive number(more than 1): ");
    if(1 != scanf("%d", &num) || num < 2){
        printf("invalid input!\n");
        return -1;
    }
    scanf("%*[^\n]");scanf("%*c");//clear upto line end

    factor(num);

    printf("Press any key to exit...");
    getchar();
    return 0;
}

void factor(int num){
    int i, flag = 0;

    if(num == 2){
        printf("\n%d is a prime number\n", num);
        return ;
    }
    while(!(num & 1)){
        if(!flag)
            printf("\n%d is not a prime number\n", num);
        flag = 1;
        printf("2 x ");
        num >>= 1;
    }
    for (i = 3; i*i <= num; i += 2){
        while(num % i == 0){
            if(!flag)
                printf("\n%d is not a prime number\n", num);
            flag = 1;
            printf("%d x ", i);
            num /= i;
        }
    }
    if(!flag)
        printf("\n%d is a prime number\n", num);
    else if(num != 1)
        printf("%d x 1\n\n", num);
    else
        printf("1\n\n");
}

答案 1 :(得分:0)

替换行,

if (num!=2&& num!=3 && num!=5 && num!=7 && num!=11 && num!=17 && num!=19)

代替,

if (num!=2||3||5||7||11||17||19)

答案 2 :(得分:0)

在函数factor中,首先尝试重复除2,然后尝试每个奇数,而所说的奇数平方小于或等于num。当您尝试除以复合数时,这种简单方法有点多余,但由于您已经删除了所有较小的素数因子,num将无法被这些复合数整除。与i * i <= num测试相比,i <= num暂停时会更早停止。

尝试编写代码以实现上述算法并将其作为编辑发布。