2016-12-03 159 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; 

}