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