我正试图通过Skiena的图书编程挑战解决问题,当提交给在线评判时,一个解决方案通过而另一个解决方案失败。
我试图理解为什么一个是可接受的答案而另一个不是。唯一的区别似乎是一个使用单独的方法而另一个没有。在哪个测试中第二个解决方案会失败?
问题如下:
3n + 1问题
考虑以下算法来生成一系列数字。从整数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之间和之间的整数的最大循环长度。这三个数字应该用一个空格分隔,所有三个数字在一行上,每行输入一行输出。
示例输入
1 10 100 200 201 210 900 1000
示例输出
1 10 20 100 200 125 201 210 89 900 1000 174
可接受的解决方案如下:
#include <stdio.h>
int cylen(int n){
int count = 1;
while (n !=1 ){
if (n%2 == 0)
n = n/2;
else
n = 3*n +1;
++count;
}
return count;
}
int maxcylen(int s, int e){
int tmp,i,maxcy, sz;
if(s>e){
tmp =s;
s = e;
e = tmp;
}
maxcy = 0;
for(i=s;i<=e;i++){
sz = cylen(i);
if (sz> maxcy)
maxcy =sz;
}
return maxcy;
}
int main(){
int s,e;
while(scanf("%d %d", &s, &e) != EOF){
printf("%d %d %d\n",s,e,maxcylen(s,e));
}
return 0;
}
不可接受的如下:
#include <stdio.h>
int cylen(int n){
int count = 1;
while (n !=1 ){
if (n%2 == 0)
n = n/2;
else
n = 3*n +1;
++count;
}
return count;
}
int main(){
int s,e, tmp,i,maxcy, sz;
while(scanf("%d %d", &s, &e) != EOF){
if(s>e){
tmp =s;
s = e;
e = tmp;
}
maxcy = 0;
for(i=s;i<=e;i++){
sz = cylen(i);
if (sz> maxcy)
maxcy =sz;
}
printf("%d %d %d\n",s,e,maxcy);
}
return 0;
}
答案 0 :(得分:0)
在第一个解决方案中,您有两个变量s
和e
,它们在main函数中定义,另外两个变量s
和e
仅在{{1}中定义功能
这些变量完全不同
在第一个解决方案中,您正在修改maxcylen
和s
,但仅限于内部函数,因此在输出结果旧时会显示来自e
的内容,这是正确的解决方案
要修复第二个解决方案,您需要这样做:
main