使用单独的方法是正确的解决方案吗?

时间:2013-11-03 06:02:04

标签: c algorithm

我正试图通过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;
}

1 个答案:

答案 0 :(得分:0)

在第一个解决方案中,您有两个变量se,它们在main函数中定义,另外两个变量se仅在{{1}中定义功能

这些变量完全不同

在第一个解决方案中,您正在修改maxcylens,但仅限于内部函数,因此在输出结果时会显示来自e的内容,这是正确的解决方案

要修复第二个解决方案,您需要这样做:

main