如何停止打印243?

问题描述

这是一个 C 程序片段,旨在找到小于 100 的 3 的第一个幂。它一直打印 243。

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

    int product = 3;

    while ( product <= 100 )
    {
        product = 3 * product;
    
        printf ("%d\n",product);
    }
}

解决方法

您在打印之前将 product 乘以 3。因此,打印出大于 100 的值。如果您在循环中交换行并先打印然后从 3 乘以; product 在第四次迭代时不会进入 while 循环

while ( product <= 100 )
{
    printf ("%d\n",product);
    product = 3 * product;
}
,

首先您要检查变量 product 的当前值,如果它满足条件,则将其乘以 3。因此,您将得到一个大于 100 的值。

您应该检查 product 的当前值乘以 3 是否小于 100,如果是,则进行乘法。

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    const int Base = 3;
    const int UpperBound = 100;
    
    int product = 1;
    
    while ( product * Base < UpperBound )
    {
        product *= Base;
    }
    
    printf( "%d\n",product );
    
    return 0;
}

程序输出为

81

如果你需要输出所有小于100的3的幂,那么程序可以如下所示

#include <stdio.h>

int main(void) 
{
    const int Base = 3;
    const int UpperBound = 100;
    
    for ( int product = 1; product < UpperBound; product *= Base )
    {
        printf( "%d\n",product );
    }
    
    return 0;
}

程序输出为

1
3
9
27
81

1 对应于 3 ^ 0

,

3 小于 100 的最大幂是 4。您的代码打印功率 5,即 243。要了解问题,您需要了解while 循环的流程。它的伪代码可以是:

  1. product = 假设 81 来自之前的执行。
  2. 进入while循环
  3. 改变产品价值
  4. 产品印刷价值

因此,在此流程中,您的代码更改了 product 的值,然后将其打印出来,因此很明显,将打印结果 243 的更改值。

要解决此问题,请在更改之前打印 product 的值。所以你的最终代码如下:

while ( product <= 100 )
{
    printf ("%d\n",product);

    product = 3 * product;
}
,

乘法前打印

#define LIMIT 100
while ( product <= LIMIT ) {
    printf ("%d\n",product); // Move here.
    product = 3 * product;
    // printf ("%d\n",product);
}

但让我们更深入

如果限制是 INT_MAX 而不是 100 会怎样? 3 * product; 会导致有符号整数溢出,这是未定义行为,UB。一个可能的结果是循环永远不会停止,因为 product <= INT_MAX 始终为真。更好的方法是检测潜在的溢出。

#define LIMIT 100 /* Or any int value */
while ( product <= LIMIT/3 ) {
    product = 3 * product;
    printf ("%d\n",product);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...