写一个素数分解程序C.

时间:2017-04-22 07:47:59

标签: c

我正在尝试编写一个显示素数分解结果的程序,如下所示:

提示:输入正整数

结果示例:

100 = 2 ^ 2 * 5 ^ 2

这是一个复合整数!

13 = 13

这是一个素数!

我尝试用基本循环编写它,而不是使用复杂的技术,因为它是初学者的类。问题是,当我输入100作为输入时,结果只是

100 =

正在打印,程序停在那里。除此之外,它给了我我想要的结果。任何人都可以帮我找到这段代码的哪一部分是什么问题?

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

int inputNumber (int* input); 
int primeFactors (int input);

int main (void) {

int input;

while ( 1 ) {
    inputNumber (&input);
    primeFactors (input);
}
return 0;
}

int inputNumber (int* input){
    printf("\nInput a positive integer : ");
    scanf("%d", input);

    if(*input == 0){
    printf("\n End of program");
    exit(0); 
    }
    return;
}

int primeFactors (int input){
    int cnt = 0, i = 3, cnt_sum;

    printf("%d = ", input);

    if(input > 0){
        while ( input % 2 == 0){
        cnt++;}
        if(cnt == 1){
            printf("%d",2);}
        else if( cnt > 0 && cnt != 1){
            printf("%d^%d",2,cnt);
        }
        cnt_sum += cnt;
        for ( ; i <= sqrt(input); i = i+2){
            cnt = 0;
            while(input % i == 0){
                cnt++;
                input /= i;
            }
            if(cnt == 1){
                printf("%d",i);
            }
            else if( cnt > 0 && cnt != 1){
                printf("%d^%d",i,cnt);
            }
            cnt_sum += cnt;
        }
        if(cnt_sum > 1){
            printf("\nIt is a composite number !\n");
        }
        else{
            printf("%d\nIt is a prime number !\n",input);
        }
    }
    else{
        printf("\nIt is an invalid number !\n");
    }
}

2 个答案:

答案 0 :(得分:1)

错误很少。

    如果输入是偶数(@Marian),
  1. while ( input % 2 == 0){cnt++;}无限循环
  2. if(input > 1){代替if(input > 0){。因为1既不是素数也不是复合物。
  3. 更正功能:

    int primeFactors (int input){
        int cnt = 0, i = 3, cnt_sum;
    
        printf("%d = ", input);
    
        if(input > 1){
            while ( input % 2 == 0){
                input/=2;
                cnt++;
            }
            if(cnt == 1){
                printf("%d",2);}
            else if( cnt > 0 && cnt != 1){
                printf("%d^%d",2,cnt);
            }
            cnt_sum += cnt;
            for ( ; i <= sqrt(input); i = i+2){
                cnt = 0;
                while(input % i == 0){
                    cnt++;
                    input /= i;
                }
                if(cnt == 1){
                    printf("%d",i);
                }
                else if( cnt > 0 && cnt != 1){
                    printf("%d^%d",i,cnt);
                }
                cnt_sum += cnt;
            }
            if(cnt_sum > 1){
                printf("\nIt is a composite number !\n");
            }
            else{
                printf("%d\nIt is a prime number !\n",input);
            }
        }
        else{
            printf("\nIt is an invalid number !\n");
        }
    }
    

    ideone

答案 1 :(得分:0)

您似乎错过了算法中的一些步骤,以及检查primeFactors函数中的冗余条件。

int cnt = 0, i = 3, cnt_sum;

因为这些不会是负数,所以您可以将类型更改为unsigned

while ( input % 2 == 0){
    cnt++;
}

如果while为奇数,则此input语句将无限循环,因为无法更改input。您可以添加input = input / 2;来停止此操作。

if(cnt == 1){
    printf("%d",2);}
else if( cnt > 0 && cnt != 1){
    printf("%d^%d",2,cnt);
}

else if表达式可以简化为else语句,因为unsigned变量总是大于0而我们已经知道cnt != 1,否则第一个语句将是触发。

while(input % i == 0){
    cnt++;
    input /= i;
}

while声明在这里很好,多么奇特。 :P

if(cnt == 1){
    printf("%d",i);
}
else if( cnt > 0 && cnt != 1){
    printf("%d^%d",i,cnt);
}

此处与之前的if / else if语句相同:将else if更改为else

应用这些更正(并修复了某些样式不一致)后,该功能现在如下所示:

int primeFactors (int input) {
    unsigned cnt = 0, i = 3, cnt_sum;

    printf("%d = ", input);

    if (input > 0) {
        while (input % 2 == 0) {
            cnt++;
            input /= 2;
        }

        if (cnt == 1) {
            printf("%d", 2);
        } else {
            printf("%d^%d", 2, cnt);
        }

        cnt_sum += cnt;

        for ( ; i <= sqrt(input); i += 2){
            cnt = 0;

            while (input % i == 0) {
                cnt++;
                input /= i;
            }

            if (cnt == 1) {
                printf("%d", i);
            } else {
                printf("%d^%d", i, cnt);
            }

            cnt_sum += cnt;
        }

        if (cnt_sum > 1) {
            printf("%d\nIt is a composite number !\n");
        } else {
            printf("%d\nIt is a prime number !\n",input);
        }
    }
    else{
        printf("\nIt is an invalid number !\n");
    }
}