【问题标题】:What is wrong with my code? prime factors我的代码有什么问题?主要原因
【发布时间】:2021-05-18 20:49:25
【问题描述】:
    int main ()
    {
    int num, i=num, isPrime;
    printf("Enter an integer: ");
    scanf("%d", &num);

    while (i>=2)
    {
        if (num%i!=0)
            i--;

        if (num%i==0) //check if it is a factor
            {
                isPrime = 1;
                for (int j=2; j<=i; j++)
                {
                    if (i%j==0)
                    {
                    isPrime = 0;
                    break;
                    }
                }
                if (isPrime==1)
                {
                    printf("%d ", i);
                    num = num/i;
                }
            }
    }
    return 0;
}

我可以知道为什么我的代码不起作用吗? 我正在尝试编写一个 C 代码,它打印给定数字的所有素因子,从最大因子到最小因子,当我运行它时,我输入一个数字后什么都不显示。

【问题讨论】:

  • 尝试在调试器中打开代码,逐行检查变量的值。
  • "May I know why is my code not working?" -- 您是否尝试过在调试器中逐行运行代码,同时监视所有变量的值,以确定您的程序在什么时候停止按预期运行?如果您没有尝试过,那么您可能想阅读以下内容:What is a debugger and how can it help me diagnose problems? 您可能还想阅读以下内容:How to debug small programs?
  • ashersm 如果输入小于 2,预期输出是什么?没有?

标签: prime-factoring


【解决方案1】:
  • 使用 printf()scanf() 所需的标头 stdio.h#include 缺失。
  • 在将值读取到 num 之前,num 被分配给 i。这是为i 分配一个不确定的值,并使用该值调用未定义的行为
  • 循环 j 直到它变为 i 是错误的,因为除非 i 为零,否则 i%i 将始终为零。
  • num%i==0i 不是素数时,您也应该减少i。否则,i 的更新将停止,循环可能会无限循环。
  • 两个if 语句if (num%i!=0)if (num%i==0) 可能会看到不同的i 值。这发生在迭代开始时num%i!=0 时,因为i 在条件为真时更新。您应该使用else 而不是第二个if 语句。

固定代码:

#include <stdio.h>

int main (void)
{
    int num, i, isPrime;
    printf("Please enter an integer: ");
    if (scanf("%d", &num) != 1)
    {
        fputs("read error\n", stderr);
        return 1;
    }

    i=num;
    while (i>=2)
    {
        if (num%i!=0) //check if it is a factor
        {
            i--;
        }
        else
        {
            isPrime = 1;
            for (int j=2; j<i; j++)
            {
                if (i%j==0)
                {
                    isPrime = 0;
                    break;
                }
            }
            if (isPrime==1)
            {
                printf("%d ", i);
                num = num/i;
            }
            else
            {
                i--;
            }
        }
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    这里至少有一个错误:

    int num, i=num, isPrime;
    

    您似乎正试图使i 等于num。但是这里 `num 甚至还没有初始化。你必须在阅读用户输入后做作业:

    int num, i, isPrime;
    printf("Please enter an integer: ");
    scanf("%d", &num);
    i=num;
    

    素数的检查也是错误的:

                for (int j=2; j<=i; j++)
                {
                    if (i%j==0)
                    {
                        isPrime = 0;
                        break;
                    }
                }
    

    由于您使用j&lt;=i,因此j 最终将等于i 并且i%j==0 将为真,因此您找不到任何素数。请改用j&lt;i

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2017-07-03
      • 2011-07-28
      相关资源
      最近更新 更多