问题
请考虑以下算法以生成数字序列。以整数 n 开头。如果 n 为偶数,则除以 2。如果 n 为奇数,则乘以 3 并加 1。使用新值 n 重复此过程,并在 n = 1 时终止。例如,将为 n = 22 生成以下数字序列: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 推测(但尚未证明)对于每个整数 n,此算法将终止于 n = 1。尽管如此,这个猜想仍然适用于至少1, 000, 000的所有整数。对于输入 n,n 的循环长度是生成的数量,最多包括 1。在上面的示例中,循环长度 22 为 16。给定任意两个数字 i 和 j,您将确定 i 和 j 之间所有数字(包括两个端点)的最大循环长度。
输入:输入将由一系列整数对 i 和 j 组成,每行一对整数。所有整数将小于 1,000,000 且大于 0。
输出:对于每对输入整数 i 和 j,输出 i、j 的顺序与它们在输入中出现的顺序相同,然后是 i 和 j 之间整数的最大循环长度。这三个数字应用一个空格分隔,所有三个数字都在一行上,每行输入都有一行输出。
问题相关代码,请勿粘贴截图
//可行代码
#include<stdio.h>
#define max(a,b) ((a>b) ? a : b)
#define min(a,b) ((a<b) ? a : b)
int num(int i) {
int ans = 1;
while (i > 1) {
if (i % 2==1)
i = i * 3 + 1;
else
i = i / 2;
ans++;
}
return ans;
}
int main()
{
int a, z,m;
while (~scanf_s("%d%d", &a, &z)) {
m = 1;
for (int i = min(a, z); i <= max(a, z); i++) {
m = max(m, num(i));
}
printf("%d %d %d\n", a, z, m);
}
return 0;
}
//不可行代码
#include<stdio.h>
int main()
{
int a, z;
while (~scanf_s("%d%d", &a, &z)){
int a1, z1,max = 1,q=1;
//确保a1<z1
if (a > z) {
a1 = z;
z1 = a;
}
else {
a1 = a;
z1 = z;
}
for (int i = a1; i <= z1; i++) {
int j = i;
if (j == 1) { q == 1; }
while (j!=1)
{
if (j % 2 == 0) { j = i / 2; }
else { j = j * 3 + 1; }
q++;
}
if (max < q) {
max = q;
}
}
printf("%d %d %d\n", a, z, max);
}
return 0;
}
运行结果及报错内容
我想要达到的结果
这两个代码有什么不同?为什么第二个代码不行?如何更改?