编写素因式分解程序C

问题描述 投票:1回答:2

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

提示:输入一个正整数

结果示例:

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");
    }
}
c algorithm primes
2个回答
1
投票

几乎没有错误。

  1. [while ( input % 2 == 0){cnt++;}如果输入为偶数(@Marian),则无限循环
  2. if(input > 1){而不是if(input > 0){。因为1既不是素数也不是复合数。

更正的功能:

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


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");
    }
}

0
投票

有人可以帮我完成我的作业吗?问题是我们将在c编程中使一个复合数字三角形。例如;4,6、89,10,1214 15 16 18

© www.soinside.com 2019 - 2024. All rights reserved.