用C语言编写素数分解程序

用C语言编写素数分解程序,c,algorithm,primes,C,Algorithm,Primes,我正试图编写一个程序,显示素因子分解的结果,如下所示: 提示:输入一个正整数 结果示例: 100=2^2*5^2 这是一个复合整数 13=13 这是一个质数 我试着只写基本的循环,不使用复杂的技巧,因为这是初学者的课。问题是当我输入100作为输入时,结果只是 一百= 正在打印,程序在那里停止。除此之外,它给了我我想要的结果。有人能帮我找出这段代码的哪一部分有问题吗 #include <stdio.h> #include <stdlib.h> #include <ma

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

提示:输入一个正整数

结果示例:

100=2^2*5^2

这是一个复合整数

13=13

这是一个质数

我试着只写基本的循环,不使用复杂的技巧,因为这是初学者的课。问题是当我输入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");
    }
}
#包括
#包括
#包括
整数输入编号(整数*输入);
整数因子(整数输入);
内部主(空){
int输入;
而(1){
输入编号(&输入);
基本要素(输入);
}
返回0;
}
int-inputNumber(int*input){
printf(“\n输入一个正整数:”);
扫描频率(“%d”,输入);
如果(*输入==0){
printf(“\n程序结束”);
出口(0);
}
返回;
}
整数因子(整数输入){
int cnt=0,i=3,cnt_和;
printf(“%d=”,输入);
如果(输入>0){
while(输入%2==0){
cnt++;}
如果(cnt==1){
printf(“%d”,2);}
如果(cnt>0&&cnt!=1),则为else{
printf(“%d^%d”,2,cnt);
}
cnt_sum+=cnt;
对于(;i 0&&cnt!=1){
printf(“%d^%d”,i,cnt);
}
cnt_sum+=cnt;
}
如果(cnt_sum>1){
printf(“\nIt是一个复合数字!\n”);
}
否则{
printf(“%d\n是质数!\n”,输入);
}
}
否则{
printf(“\n它是一个无效的数字!\n”);
}
}
几乎没有bug

  • while(输入%2==0){cnt++;}
    如果输入为偶数(@Marian),则无限循环
  • 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");
        }
    }
    
    int primeFactors(int输入){
    int cnt=0,i=3,cnt_和;
    printf(“%d=”,输入);
    如果(输入>1){
    while(输入%2==0){
    输入/=2;
    cnt++;
    }
    如果(cnt==1){
    printf(“%d”,2);}
    如果(cnt>0&&cnt!=1),则为else{
    printf(“%d^%d”,2,cnt);
    }
    cnt_sum+=cnt;
    对于(;i 0&&cnt!=1){
    printf(“%d^%d”,i,cnt);
    }
    cnt_sum+=cnt;
    }
    如果(cnt_sum>1){
    printf(“\nIt是一个复合数字!\n”);
    }
    否则{
    printf(“%d\n是质数!\n”,输入);
    }
    }
    否则{
    printf(“\n它是一个无效的数字!\n”);
    }
    }
    

    您的算法中似乎缺少了一些步骤,并且在
    primeFactors
    函数中检查了冗余条件

    int cnt = 0, i = 3, cnt_sum;
    
    因为它们永远不会是负数,所以可以将类型更改为
    unsigned

    while ( input % 2 == 0){
        cnt++;
    }
    
    如果
    input
    为奇数,则该
    while
    语句将无限循环,因为未对
    input
    进行任何更改。您可以添加
    input=input/2;
    以停止此操作

    if(cnt == 1){
        printf("%d",2);}
    else if( cnt > 0 && cnt != 1){
        printf("%d^%d",2,cnt);
    }
    
    else if
    表达式可以简化为
    else
    语句,因为
    无符号
    变量总是大于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");
        }
    }
    
    int primeFactors(int输入){
    无符号cnt=0,i=3,cnt_和;
    printf(“%d=”,输入);
    如果(输入>0){
    while(输入%2==0){
    cnt++;
    输入/=2;
    }
    如果(cnt==1){
    printf(“%d”,2);
    }否则{
    printf(“%d^%d”,2,cnt);
    }
    cnt_sum+=cnt;
    对于(;i 1){
    printf(“%d\n它是一个复合数字!\n”);
    }否则{
    printf(“%d\n是质数!\n”,输入);
    }
    }
    否则{
    printf(“\n它是一个无效的数字!\n”);
    }
    }
    
    你调试过你的代码吗?这只发生在输入为100时吗?
    而(输入%2==0){cnt++;}
    如果
    输入为偶数,则无限循环。