用C语言嵌套for循环

时间:2016-12-03 09:41:27

标签: c loops for-loop

丰数是一个自然数,小于其适当除数的总和。例如12 < 1+2+3+4+6=16所以12是一个数字丰富,而16 > 1+2+4+8=15不是一个丰富的数字。 我必须用C语言编写一个程序,这样对于输入k,输出都是小于或等于k的大量数字。

我只是这方面的初学者所以我最初想要做的是编写一个程序来检查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作为输出?

4 个答案:

答案 0 :(得分: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++;
}

<强>顺便说一句:

始终检查scanf的返回值 - 例如:

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

答案 1 :(得分:0)

内循环执行k次;

  1. 当i = 1时没有任何反应
  2. 当i = 2时,内循环检查2是否丰富
  3. 当i = 3时,内循环检查3是否丰富
  4. 等等。也许最好重写代码,以便变量名解释其含义。

答案 2 :(得分: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;
    }

答案 3 :(得分: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;

}