我在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之后,它仍然不起作用,不再崩溃但它从未计算任何东西,我必须手动退出程序。知道如何解决这个问题吗?
答案 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 style,Java style或GNU style缩进。您当前的Banner style很难阅读并且不鼓励大多数人。