我正在尝试编写一个显示素数分解结果的程序,如下所示:
提示:输入正整数
结果示例:
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");
}
}
答案 0 :(得分:1)
错误很少。
while ( input % 2 == 0){cnt++;}
无限循环
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");
}
}
答案 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");
}
}