尽可能做一个操作的函数

Function to do an operation as much as possible

我是编程新手,我想在对 A 应用以下操作后查看 A 是否等于 B。`

如果 A 等于 B 则输出 Yes,否则输出 No。 我使用以下代码:

#include <stdio.h>

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    getchar();

    if (a == 1) {
        a = a;
    }
    else if (a % 2 == 0) {
        a = a / 2;
    }
    else if (a % 2 == 1) {
        a = a * 3 + 1;
    }

    if (a == b) {
        printf("Yes\n");
    }
    else {
        printf("No\n");
    }

    return 0;
}

这很好用,但我想尽可能多地进行手术。例如如果 A=12 且 B=5 -> 12/2=6 ->6/2=3->3+2=5。因此A=B。我使用什么功能来做到这一点?

这将是一个很好的 while 循环应用程序:

while(a != 1 && a != b) {
    if(a % 2 == 0) {
        a = a / 2;
    } else if(a % 2 == 1) {
        a = a * 3 + 1;
    }
}
if(a == b) {
    printf("Yes\n");
} else {
    printf("No\n");
}

确保您了解循环条件,它决定了“尽可能多”的含义,以及为什么最终检查在循环体之外进行。

数字 4 和 2 是任何收敛序列的隐含部分,因为 4 = 3 * 1 + 12 = 4 / 2。一个复杂的是将它们包括在内是让 a 在结束循环之前达到 1 两次。一个更简单的检查是将最后的 if 更改为

if(a == b || b == 4 || b == 2) {

由于 Collat​​z 猜想仍然是一个未解决的问题,因此无法保证循环在所有情况下都会收敛。同时,这也意味着没有人能够找到a至少不达到统一的情况。

所有大于 2^68 的数字都显示收敛于 1。这意味着在支持 long double 的机器上,尾数精度为 80 位,或 128 位整数,你可以想象得到非收敛输入,或收敛到不同于一个的输入。因此,也许测试重新访问的数字比测试收敛到 1 更好。