【问题标题】:Using a separate method is a correct solution?使用单独的方法是正确的解决方案吗?
【发布时间】:2013-11-03 06:02:04
【问题描述】:

我正在尝试解决 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 之间(包括 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;
}

【问题讨论】:

  • 请修复缩进...问题是制表符,最好不要在 SO 问题中使用它们。
  • 注意:对于未来的代码,请考虑while(scanf("%d %d", &amp;s, &amp;e) == 2)。如果您只成功扫描了 1 个,您可能不想继续。

标签: c algorithm


【解决方案1】:

在第一个解决方案中,您有两个变量 se,它们在主函数中定义,两个单独的变量 se 仅在 maxcylen 函数中定义

这些变量是完全不同的

在第一个解决方案中,您正在修改 se,但仅在函数内部,因此在输出结果期间 old 显示来自 main 的结果,这是正确的解决方案

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

int s,e, tmp,i,maxcy, sz, originalS, originalE; // note 2 additional variables
while(scanf("%d %d", &s, &e) != EOF){
    originalS = s; // storing of values from file
    originalE = e;
    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",originalS,originalE,maxcy); // output of variables from file, instead of modified ones
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2021-07-29
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多