【问题标题】:Iteration controlled loop not working correctly迭代控制循环无法正常工作
【发布时间】:2017-11-15 05:18:41
【问题描述】:

以下应该生成 2 个介于 0 和 100 之间的随机数,它们遵循一定的规则。

这些规则是:

*都不可能是0

*Num1 必须大于 Num2

*并且Num1必须能被Num2整除(num1 % num2位)

目前循环在前两点上正常工作,但不是最后一点。它仍在生成 num1 不能被 num2 整除的数字。出了什么问题?

do {
        if (num1 == 0) {
            num1 = rand()%100;
        }
        else if(num2 == 0) {
            num2 = rand()%100;
        }
        else if (num1 < num2) {
            num2 = rand()%100;
        }
        else if(num1 % num2 != 0) {
            num2 = rand()%100;
        }
        a++;
        printf("Loop no.:%d %d mod %d = %d %d / %d \n",a,num1,num2,num1%num2,num1,num2);
    } while(num1 < num2 && (num1%num2 != 0) && num1 != 0 && num2 != 0);

【问题讨论】:

  • num1 = rand()%100; 仍可能生成 0
  • 如果两个条件都不满足,numX 不会改变。所以它将永远循环
  • 为什么要测试两个地方的条件?如果您要使用 generate-then-test 方法,请生成数字,然后测试它们,如果失败则重新生成它们。但是把测试放在一个地方。

标签: c


【解决方案1】:

这可以更有效地完成。

从一个数字开始,

num2 = rand()%50 + 1;

这将是较小的数字。如果大于 50,则不可能有第二个数字。
然后,计算num1 可能有多少个数字。由于num1必须是num2的倍数,且小于等于100,也可能与num2不同:

int nnum1 = 100/num2 - 1;

那个,随便挑一个:

num1 = (rand()%nnum1 + 2)*num2;

Live demo here

【讨论】:

    【解决方案2】:

    如果您想满足所有条件,您的while-条件实际上应该类似于while(num1 &lt; num2 || (num1%num2 != 0) || num1== 0 || num2 == 0)。如果您通过&amp;&amp; 连接条件,则一旦不满足其中一个条件,循环将结束,例如当num1 不能被num2 整除时。

    【讨论】:

    • 我知道我遗漏了一些明显的东西,感谢您指出。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多