【问题标题】:Trouble getting required output in C++无法在 C++ 中获取所需的输出
【发布时间】:2021-07-14 20:23:19
【问题描述】:

我们收到了一个作业中的问题。我在解释它时遇到了麻烦,所以我用相同的条件用 C++ 重写了它。但是,我似乎无法获得问题中列出的正确输出。有人可以告诉我如何进行吗?

这是问题的一个片段。

这是我的代码:

    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
        int n; //AreWeThereYet
        string a;
        a="Yes we have arrived";
        string b;
        b="We just left";
        string c;
        c="That was annoying";
        string d;
        d="Almost";
        int i;
    
        cout << "enter n" << endl;
        cin >> n;
    
        for(int i=0;i<=n;i++){
            //here starts the calc
            if(n==0){
                cout << a << endl;
                return 0;
            }
            if(n>5){
                cout << b << endl;
                n=(n-1);
            }else if(n>1){
                n=(n-2);
                cout << c << endl;
            }else{
                cout << d << endl;
                n=(n-1);
            }
        }
    }

循环似乎无法输出第一个和最后一个问题。

我想如果我复制这个问题,我可以通过反复试验来获得我需要的答案。 下面我附上了我的输出图像。我希望输入“1”会输出“几乎”,然后是“是的,我们已经到达”。

Current output

【问题讨论】:

  • 在未使用循环的问题中,正在递归调用函数。
  • 所有必要的信息都应该直接在问题中。请包括预期和实际的输出和输入
  • 您链接的图像要求为所示代码的给定输出确定n。您的代码似乎试图复制图像中的代码,而不是尝试为给定的输出复制其输入
  • @largest_prime_is_463035818 我对堆栈溢出和计算机科学也很陌生。我还不确定如何设置代码来复制输入。我将尝试添加图像以在终端中显示我的输出。你能帮我解决不和吗?如果没有,那么没问题。
  • 这个不用写代码就可以回答。可以肯定的是,编写代码不会受到伤害。但能够通过它进行推理是一个想法,也是更好的实践。

标签: c++ loops conditional-statements


【解决方案1】:

我们可以检查和讨论第一个案例。

输出应该是:

Almost
Yes we have arrived
That was annoying
That was annoying

如果你画出一条数轴:

<- <0  -         0         -   1  -      2-3-4-5    -   6+       ----->
 Almost|Yes we have arrived|Almost|That was annoying|We just left|

然后,我们只看输出并开始推理。

几乎出现在负数和 1 上。我们可以排除负数,因为没有办法从负数跳到正数,因为每种情况都会做减法。所以,第一个“几乎”意味着 n 是 1。这解释了前两行,但不是最后两行。那么,我们如何得到“这很烦人”?

它需要在 [2, 5] 范围内的 n。请注意这种情况,它首先进行递归调用,然后打印“那很烦人”。那么,n 的起始值可以落在“那很烦人”块中并调用“几乎”块?

答案是 3。所以现在我们将手动遍历算法,假设 n = 3。

当 n == 3 时,它落入条件 n > 1。它做的第一件事就是用值 n - 2 = 1 调用自己。这会打印“几乎”,然后是“是的,我们已经到达”,因为带有“几乎”的块用 n - 1 = 0 调用自己。现在所有嵌套调用都已处理完毕,当 n== 3 时,我们返回到初始块,并打印“那很烦人”,但我们只打印一次。所以,3 是不对的。

如果我想再次打印“那很烦人”,那么我只需要将 n 增加到 4。

我们可以快速检查 n = 4。我将降落在“烦人”块,用 n - 2 = 2 进行调用,然后再次降落在“烦人”块(我们需要打印' 这很烦人),然后用 n - 2 = 0 进行 另一个 调用。我们跳过了“几乎”,所以 4 是不对的。

所以我们看 5. 5 - 2 = 3, 3 - 2 = 1。一路追踪,应该会产生相同的输出。

没有代码,只有一个号码线和跟踪电话。这可以通过物理记事卡或绘制递归堆栈来完成。

如果您仔细查看第三个输出,您应该注意到它已经大部分解决了,因为最后四行与我们刚刚解决的块相同。

这是一种很好的解决问题的技巧;使用以前解决的问题来分解和解决更大的问题。这就是为什么这个任务最好不用代码来完成,并由你提出解决方案。其他人的解决方案最终成为您自己池中唯一的解决方案,而您将更加挣扎。

【讨论】:

  • 非常感谢。这个解释真的帮助我理解了如何回答这个问题。我将继续为以下 q 使用数字线。
  • 我只想指出,一些较早的版本指出 4 是第一个输出的正确答案。这是不正确的,我的答案已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多