c - 为什么它显示主要因素的错误输出?
问题描述
我制作了这个程序来查找数字的素数,但是当我运行这段代码时,它给出了错误的输出。我已经调试了这段代码,逻辑也是正确的。我发现,当“x == 1”时,程序行为不端。我无法找到答案。
#include<stdio.h>
void prime(int );
main()
{
int num;
printf("Enter a number to find its prime factors: ");
scanf("%d", &num);
printf("\nPrime factors of %d are: \n", num);
prime(num);
}
void prime(int x)
{
int i = 2;
while(x != 1)
{
if(x % i == 0)
{
printf("%d, ", i);
x = x / i;
prime(x);
}
else
{
i++;
}
}
}
解决方案
一旦找到第一个除数,就应该从循环中中断。否则,您的外部方法调用将继续搜索您的除数,x
即使不再需要它:
void prime(int x) {
if (x == 0) {
printf("All prime numbers are prime factors of 0");
return;
}
if (x == INT_MIN) {
printf("Please provide a number larger than %i", INT_MIN);
return;
}
x = abs(x);
int i = 2;
while(x != 1) {
if(x % i == 0) {
printf("%d, ", i);
x = x / i;
prime(x);
break; // break here
}
i++;
}
}
更新
但是,这里实际上不需要递归 - 相反,您可以使用如下简单的迭代算法:
void prime(int x) {
if (x == 0) {
printf("All prime numbers are prime factors of 0");
return;
}
if (x == INT_MIN) {
printf("Please provide a number larger than %i", INT_MIN);
return;
}
x = abs(x);
int i = 2;
while (x != 1) {
if (x % i == 0) {
printf("%d, ", i);
x = x / i;
}
i++;
}
}
推荐阅读
- flutter - 实施 CupertinoActionSheet 的正确方法是什么?
- angular - @Input=Function(Params1,Params2) 总是在单击任何位置 Angular 时调用
- javascript - 格式化输入数组,结果应该是Angular中以下给定格式的分组数组
- javascript - 如何根据每个对象中的字符串属性数组深入比较/匹配数组中的对象?
- python - Python:如何快速创建仅包含大型 Excel 工作表中特定列的 pandas 数据框?
- xamarin - 更新到 13.1 后,Xamarin.Forms 应用程序在 iOS 上崩溃
- mysql - 如何从表 1 中查询单行和从表 2 中查询多行?
- python-3.x - 在 y_true 变量中查找单个类 1 的 roc/auc/auc-roc 分数
- c++ - C ++:读取文本文件中不确定数量的变量并在struct中修改,然后替换文本文件中的行
- html - Fontawesome SVG 显示白色背景 - 我希望它没有背景