我正在尝试编写一个显示素因数分解结果的程序,如下所示:
提示:输入一个正整数
结果示例:
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");
}
}
几乎没有错误。
while ( input % 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");
}
}
您似乎缺少算法中的某些步骤,以及在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");
}
}
有人可以帮我完成我的作业吗?问题是我们将在c编程中使一个复合数字三角形。例如;4,6、89,10,1214 15 16 18