2012-03-01 39 views
0

我已經在C中編寫了一些代碼,用於計算從1到n(n是從用戶輸入的)所有素數。計算從1到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

請描述您的代碼崩潰,什麼錯誤信息。 – 2012-03-01 10:06:48

+0

另外,爲什麼不用代替while,它使代碼不必難以閱讀 – Azrael3000 2012-03-01 10:07:46

+1

「continue」後面的代碼已經死了,即從未執行過。請修復你的括號和縮進。 – Kos 2012-03-01 10:08:04

回答

2

你的「我」和「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; 
} 
+0

BOOM我除以0> _ <我真是個笨蛋!謝謝! – Erick 2012-03-01 10:15:18

+0

的確如此。如果沒有發生,程序會循環,因爲行++ x永遠不會執行。 – 2012-03-01 10:15:40

+0

謝謝,你幾乎解決了程序缺陷。非常感謝! – Erick 2012-03-01 10:26:49

0

除以零誤差。您需要使用int i = 1。該計劃爲一個運行時錯誤時,除以0

這是無關緊要的,但你真的應該考慮使用標準Allman styleJava styleGNU style縮進C.您當前Banner style是難以閱讀和被大多數人望而卻步。

+0

謝謝!我犯了世界上最愚蠢的錯誤;) – Erick 2012-03-01 10:15:38

+0

@Erick大聲笑,沒問題。每個人都會犯錯。 – ApprenticeHacker 2012-03-01 10:16:31

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 
+0

謝謝,我不知道這樣的功能存在。你一直很有幫助。 – Erick 2012-03-01 10:28:47

+0

@Erick:'gdb'功能非常強大,可以做的不僅僅是後退。請參閱http://en.wikipedia.org/wiki/GNU_Debugger – bitmask 2012-03-01 10:33:16