计算从1到n的素数 - 崩溃

时间:2012-03-01 10:04:15

标签: c

我在C中编写了一些代码,用于计算从1到n的所有素数(n是从用户输入的)。

作为给出其中一个实际算法的形式,这有点超出我的技能范围,我决定用蛮力来做:

编辑:img(无法发帖,少于10个代表http://i44.tinypic.com/332t9uv.jpg)这就是我实际编码的方式,不知道为什么我的代码格式在发布时发生了变化,抱歉。

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int n, i = 1, x = 1;
  printf("Porfavor escriba el numero: ");
  scanf(" %d", &n);
  while (i != n)
  {
    x = 1;
    while (x <= i)
    {
      if (x % i == 0)
      {
        continue;
        ++x;
        if (x == i && x % i != 0)
          printf("%d ", x);
      }
    }
    i++;
  }
  return EXIT_SUCCESS;
}

这一切都很好并要求输入,但在用户输入n程序崩溃后,我有点难过为什么它这样做。

任何帮助将不胜感激!谢谢!

编辑:在使它们不为0之后,它仍然不起作用,不再崩溃但它从未计算任何东西,我必须手动退出程序。知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

你的'i'和'x'都从0开始。所以当你做

x%i

计算机不能除以0并给出浮点异常

编辑:进一步说,程序的逻辑是有缺陷的。即使你做了

int i=1,x=1;

程序将进入无限循环,因为

//x=1 and i=1
while(x <= i){
        if(x%i == 0){
        //This condition is always true
        continue; //Program will go to start of loop without changing numbers
        ++x;    //This will never happen

所以循环变得无限。 虽然C ++中有一些库可以为你做这些,但如果你想坚持使用暴力,你需要做以下事情

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i = 2, x = 2;
    printf("Enter the number: ");
        scanf("%d", &n);
    while(i <= n)  //For each number i in range (2,n)
    {
        x = 2;
        while(x < i)
        {
            if(i%x == 0)  //Check if i divisible by x
            {
            break; //Since it divides this number can't be prime
            }
            else
            {
                //Check next number
                x++;
            }
        }
        //We come out of above loop through break or natural end to execution. 
        //Check if natural end has occurred
        if(x==i)
        {
            //All numbers were checked but i isn't divided by any
            //It is PRIME!!
            printf("\n%d", x);
        }
        i++;
    }


    return EXIT_SUCCESS;
}

答案 1 :(得分:2)

如果您将来遇到此类问题,可以通过在gdb中运行程序轻松跟踪它们:

# compile:
gcc -Wall -ggdb main.c
# run in gdb:
gdb --args ./a.out
# ... lots of notes of gdb ...
> run
Porfavor escriba el numero: 7
# program crashes at some point
# let's have a look at it with a backtrace
# (it will also print the line where the program crashed)
> bt

答案 2 :(得分:0)

除以零错误。您需要使用int i = 1。程序在除以0时会产生运行时错误。

这是无关紧要的,但您应该考虑使用C中的标准Allman styleJava styleGNU style缩进。您当前的Banner style很难阅读并且不鼓励大多数人。