c-尽可能多地执行操作的功能



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

  • 如果A=1,则A=A
  • 如果A是偶数,则A=A/2
  • 如果A是奇数,则A=A*3+1

如果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("Yesn");
}
else {
printf("Non");
}
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("Yesn");
} else {
printf("Non");
}

确保你理解循环的条件,它决定了什么";"尽可能多";意味着,以及为什么在循环主体之外进行最终检查。

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

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

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

所有在2^68左右的数字都被证明收敛到1。这意味着,在支持尾数精度为80位或128位整数的long double的机器上,你可以想象得到一个非收敛输入,或者一个收敛到一个以外的输入。因此,测试重新访问的数字可能比测试收敛到1更好。

最新更新