2016-12-03 199 views
1

豐富數字是一個小於其正確除數總和的自然數。例如12 < 1+2+3+4+6=16所以12是一個豐富的數字,而16 > 1+2+4+8=15不是一個豐富的數字。 我必須用C語言寫一個程序,這樣對於輸入k,輸出都是大於或小於k的大數。用C語言嵌套for循環

我只是一個初學者,所以我最想做的是編寫一個程序來檢查k是否豐富。所以這是我做過什麼:

#include <stdio.h> 

int main(void) { 
    int k, i, s = 0; 
    scanf("%d", &k); 
    for (i = 1; i < k; i++) { 
     if (k % i == 0) 
      s = s + i; 
    } 
    if (k < s) 
     printf("%d" is an abundant number", k); 
    return 0; 
} 

隨意上述忽視這一點,我只是想告訴你我其實我自己嘗試過的東西。現在,我不知道如何使這個程序列表中的豐富數字,也低於k,但我發現我不明白的解決方案:

#include <stdio.h> 

int main(void) { 
    int k, i, j, s; 
    scanf("%d", &k); 
    for (i = 1; i <= k; i++) { 
     s = 0; 
     for (j = 1; j < i; j++) { 
      if (i % j == 0) 
       s = s + j: 
     } 
     if (i < s) 
      printf("%d"\n", i); 
    } 
    return 0; 
} 

我很困惑這個嵌套的for循環,有人可以解釋它究竟是如何工作的?例如,如果我們把k = 18,這個for循環究竟發生了什麼,所以最後我們得到12和18作爲輸出?

+0

的單曲= S + J:' - 這看起來完全打破 – artm

+0

外迴路從1至18,包括。所以內部循環看起來像這樣:for(j = 1; j <1; j ++)'第一次。(j = 1; j <2; j ++)',然後在for(j = 1; j <3; j ++)'後,它會到達for(j = 1; j < 12; j ++)'和'for(j = 1; j <18; j ++)'嘗試在紙上運行它。 – OopsUser

+0

您的第一個for循環中的所有內容都與您編寫的用於檢查數量是否豐富的程序相似。這個for循環運行這個代碼,我的值從1到18. –

回答

1

我認爲最好的方法是手動完成代碼並記下執行代碼的行號以及變量如何變化。

L01: int k,i,j,s;    // k=?, i=?, j=?, s=? 
L02: scanf("%d", &k);   // k=18, i=?, j=?, s=? 
L03: for(i=1;     // k=18, i=1, j=?, s=? 
L03:    i<=k;    // TRUE 
L04:  s=0;     // k=18, i=1, j=?, s=0 
L05:  for(j=1;    // k=18, i=1, j=1, s=0 
L05:     j<i;   // FALSE 
L03:      i++)  // k=18, i=2, j=1, s=0 
L03:    i<=k;    // TRUE 
L04:  s=0;     // k=18, i=2, j=1, s=0 
L05:  for(j=1;    // k=18, i=2, j=1, s=0 
L05:     j<i;   // TRUE 
L06:   if(i%j==0)   // TRUE 
L07:    s=s+j:   // k=18, i=2, j=1, s=1 
L05:      j++)  // k=18, i=2, j=2, s=0 
L05:     j<i;   // FALSE 
and so on .... 

我需要相當長的時間,但是你應該知道如何for循環的作品很快就會看到的圖案和那裏。

,可以幫助你瞭解for循環的另一件事是要認識到

for(i=0; i<N; i++) 
{ 
    code... 
} 

相當於

i=0; 
while (i<N) 
{ 
    code... 

    i++; 
} 

BTW:

經常檢查從scanf返回值 - 例如:

if (scanf("%d", &k) != 1) 
{ 
    printf("Input error! Program terminates.\n"); 
    exit(1); 
} 
+0

在if(i%j == 0)爲false的內循環中,我們回到外循環?例如,當i = 3和j = 2時,3%2 == 0是錯誤的,那麼我們取i = 4和j = 2? – Lewis

+1

@Now_now_Draco_play_nicely - 不,代碼「if(i%j == 0)」不是循環的一部分終止條件 - 它是循環體中的代碼。當'(i%j == 0)'爲假時,下一個語句爲'j ++',然後爲'j'(可能或不可能終止內部循環) – 4386427

+0

當j <我是假的,那麼下一個陳述是我++? 另外,當我達到i = 12時,你能告訴我什麼,j和s應該是什麼? – Lewis

0

內循環執行k次;

    i = 1個時沒有任何反應
  1. 當i = 2次內循環檢查,如果2是豐富與否
  2. 當i = 3內循環檢查,如果3是豐富與否

等等。也許最好重寫你的代碼,以便變量名解釋它的含義。

0

我寫了一個更簡單的實現。這與你自己的嘗試是一樣的。只是它是足夠運行直到K/2代替K-1

#include<stdio.h> 
    int main(void) { 

     int k,i,j,s; 
     scanf("%d", &k); 
     s=0; 
     for(i=1; i<=(k/2); i++) { //running till half of the entered value is sufficient 
      if(k%i == 0) 
      { 
       s+=i; //if it is a divisor add it to the sum 
      } 
     } 
     printf("sum is %d\n\r",s); 
     if(k<s) 
      printf("%d is abundant\n\r",k); 
     else 
      printf("%d is not abundant\n\r",k); 
     return 0; 
    } 
0
#include<stdio.h> 

int main(void) { 

int upper_limit,candidate,divisor,s; 

scanf("%d", &upper_limit); 

for(candidate=1; candidate<=upper_limit; candidate++) { 

    s=0; 

    for(divisor=1; divisor<=(candidate/2); divisor++) { 

     if((candidate%divisor)==0) 

      s=s+divisor: 
    } 

if(candidate<s) 
    printf("%d"\n", candidate); 

} 

return 0; 

}