【问题标题】:Attempting to add the numbers in a Fibonacci sequence尝试在斐波那契数列中添加数字
【发布时间】:2022-10-24 04:12:17
【问题描述】:

我正在尝试添加 3n+1 序列中的所有数字。

我的预期输出是n=20,它将返回66.n=4 返回7n=31 返回101104

显然我在下面写的代码会做一些基本的数字,但在那之后它就会到处乱跑。

int sumSeq3nPlus1(int n) {
    if (n <= 0) {
       return 0;
    }
 
    int fib[n+1];
    fib[0] = 0; 
    fib[1] = 1;
 
    int sum = fib[0] + fib[1];

    for (int i = 2; i <= n; ++i) {
        fib[i] = fib[i-1] + fib[i-2];
        sum += fib[i];
    }
    return sum;
}

添加我们被问到的图像: https://imgur.com/a/o0ISNHB

【问题讨论】:

  • int fib[n+1];——无论哪一本 C++ 教科书告诉你这样做——你需要立即扔掉它,并获得另一本 C++ 教科书。如果您从某个网站上复制了该内容,请不要再访问该网站。如果您在某个小丑的 Youtube 视频中看到这一点,请取消订阅该频道,您就没有学习正确的 C++。这不是标准的 C++,许多 C++ 编译器会拒绝编译它。
  • 旁注:无论如何,您可能都不需要该数组。在计算斐波那契时,您真正关心的只是最后一个数字,因此没有必要记录旧值。
  • 根据所提供的信息,您班上的任何人都无法做到这一点,如前所述。他们都会失败。
  • 你确定sumSeq3nPlus1 应该是斐波那契吗? 3n+1 不会对我尖叫斐波那契。
  • 这听起来更像是科拉茨猜想,与斐波那契数列无关……

标签: c++ fibonacci


【解决方案1】:

我弄清楚了真正的问题是什么......

给定 3n+1 序列,如 Collatz conjecture 中使用的那样:

next = 3*current + 1 if current is odd  
next = current/2 if current is even  

返回从 n 开始到 1 结束的序列的总和。

这与斐波那契数列无关。

您需要做的是计算序列的运行总和:从 n 开始,然后添加下一项,依此类推,直到您得到的项为 1,此时添加 1 并返回总和。

例子:
对于n=4,总和为4+2+1 = 7
对于n=20,总和是20+10+5+16+8+4+2+1 = 66
对于n=31,总和是31+94+47+142+71+214+107+322+161+484+242+121+364+182+91+274+137+412+206+103+310+155+466+233+700+350+175+526+263+790+395+1186+593+1780+890+445+1336+668+334+167+502+251+754+377+1132+566+283+850+425+1276+638+319+958+479+1438+719+2158+1079+3238+1619+4858+2429+7288+3644+1822+911+2734+1367+4102+2051+6154+3077+9232+4616+2308+1154+577+1732+866+433+1300+650+325+976+488+244+122+61+184+92+46+23+70+35+106+53+160+80+40+20+10+5+16+8+4+2+1 = 101104

【讨论】:

    【解决方案2】:

    我编写的循环添加乞求数 n = x,然后将其添加到其序列中。

    int sumSeq3nPlus1(int value) {
        
        int n = 0;
        
        while(value > 1) {
            n += value;
            if (value % 2 != 0) {
                value = 3 * value + 1;
            }
            else {
                value = value / 2;
            }
        }
        return n + 1;
    }
    

    【讨论】:

    • 您正在修改value将其添加到n,这样就不会添加第一个数字(例如 20)。此外,您应该编辑您的问题,而不是将其写为答案。
    • @Beta 我将只等待两天,感谢您向我展示我正在修改它。我上面写的代码解决了我的问题并解决了我的编码问题。
    猜你喜欢
    • 2020-01-18
    • 2015-06-05
    • 1970-01-01
    • 2013-08-03
    • 2014-05-19
    • 2015-08-30
    • 2013-03-14
    相关资源
    最近更新 更多