0

这段代码给我创造了一个无限循环我想按照一些步骤让数字首次亮相为 0 并打印程序执行它需要多少步骤

    int debut,i;
    printf("de (>= 1) ? ");
    do
    {            
        scanf("%d",&debut);
    } 
    while (debut < 1);

    int fin;
    printf("a >=  <<  << ) ? ");
    do 
    {            
        scanf("%d",&fin) ;
    } 
    while (fin < debut);

   for (;debut<=fin;debut++){
       i=0;
       while(debut!=0)
       {
           if(debut%3==0)
           {
               debut+=4;
           }
           else if (debut%3!=0 && debut%4==0){
               debut/=2;
           }
           else if (debut%3!=0 && debut%4!=0)
           {
               debut-=1;
           }
           i+=1;

       }
       printf("%d\n->%d",debut,i);    
       }
4

2 回答 2

2

简短回答:我怀疑您打算将 while 循环用于 的副本debut而不是debut其本身。


  • 让我们假设debut == 3fin == 5
  • 我们执行 for 循环的第一次迭代,这涉及到 while 循环的完整演练。
  • 在 while 循环之后,我们有debut == 0fin == 5i == 12
  • 然后我们打印一些信息。
  • 但是,我们现在要再次迭代 for 循环。debut由于我们所做的工作,已经减少到0,所以每次我们运行这段代码时,在 for 循环迭代结束时,我们将有一个debut == 0,这将导致 for 循环永远不会退出。

将其与代码内联显示可能会更有帮助...

for (;debut<=fin;debut++){
    // Let's assume we get here. We can assume some sane debut and fin values,
    // such as the 3 and 5 suggested above.

    int i=0;
    while (debut != 0) {
        // Stuff happens that makes debut go to zero.
    }

    // To get to this point, we __know__ that debut == 0.
    // We know this because that's the condition in the while loop.

    // Therefore, when we do the comparison in the for loop above for the
    // next iteration, it will succeed over and over again, because debut
    // has been changed to zero.

    printf("%d->%d\n",debut,i);
}

就个人而言,我怀疑您正在寻找一组数字的迭代次数。对我来说,这听起来像是一个使用函数的完美场所。我建议的代码看起来像这样。

#include <stdio.h>

int iterations(int debut) {
    int i = 0;

    while(debut!=0)
    {
        if(debut%3==0)
        {
            debut+=4;
        }
        else if (debut%3!=0 && debut%4==0){
            debut/=2;
        }
        else if (debut%3!=0 && debut%4!=0)
        {
            debut-=1;
        }

        i+=1;
    }

    return i;
}

int main() {
    int debut = 3;
    int fin = 5;

    for (;debut<=fin;debut++) {
        printf("%d -> %d\n", debut, iterations(debut));
    }
}

另外,为了注意事项,请注意在我最后给出的示例代码中,我删除了所有输入的 scanf 代码。它与您的实际问题无关,它减少了任何人需要扫描以了解您的问题所在的代码总量。

于 2013-10-25T17:54:43.260 回答
2
for(debut<=fin;debut++) {
    while(debut!=0) {
        //do stuff
    }
    //debut == 0, debut <= fin
}

好的,对我的答案进行大量编辑。我在看错误的循环。

为了进入for循环,debut必须是<=fin. 任何时候,并且fin进入循环,你都会被困在循环中。>0forfor

你被困在while循环中,直到debut == 0返回true。只要debut++ <= fin,您就会陷入困境for。您正在循环中进行修改,但debut保持相同的值。所以循环减少到并且循环每次都进入下一次迭代。whilefinwhiledebut0for

于 2013-10-25T17:46:59.917 回答