检查斐波那契类数列中第 n 项是奇数还是偶数
我们在这个问题中的任务是检查斐波那契类数列的第 n 项是奇数还是偶数。斐波那契数列是一种数学数列,其中数列中的每个数字都是前两个数字的和。
斐波那契数列的第 n 项可以表示为 -
$$\mathrm{Fn\:=\:F_{n-1}\:+\:F_{n-2}}$$
斐波那契数列的前几个数字是0, 1, 1, 2, 3, 5, 8, 13, 21, 34….。
数列的前两个数字是 0 和 1。接下来的数字是前两个数字的和,正如我们在数列中看到的那样。
类似地,在这个问题中,我们将得到一个斐波那契类数列,其中数列中的每个数字都等于前两个数字的和。
我们将得到斐波那契类数列的前两项,假设为 和 ,以及一个正数 N 作为输入。我们需要在这个问题中找出 是否为奇数或偶数。
斐波那契类数列的第 N 项可以通过 给出,这与第 N 个斐波那契数相同,因为它遵循与斐波那契数列相同的模式。
让我们通过一些例子更好地理解这个问题
输入 : $\mathrm{x_0}$=2 , $\mathrm{x_1}$=4 , N=5
输出 : 偶数
解释 - 由于数列的前两项在输入中给出,即 2 和 4。要计算数列的第 N 项,即第 5 项,我们需要计算直到 5 的所有项。因此,可以使用第 N 项的公式找到该数列的下一项。
$$\mathrm{x_2\:=\:x_1\:+\:x_0\:=\:2\:+\:4\:=\:6}$$
$$\mathrm{x_3\:=\:x_2\:+\:x_1\:=\:6\:+\:4\:=\:10}$$
$$\mathrm{x_4\:=\:x_3\:+\:x_2\:=\:10\:+\:6\:=\:16}$$
$$\mathrm{x_5\:=\:x_4\:+\:x_3\:=\:16\:+\:10\:=\:26}$$
由于数列的第 5 项是 26,这是一个偶数
输入 : $\mathrm{x_0}$=3 , $\mathrm{x_1}$=7 , N=4
输出 : 奇数
解释 - 使用第 N 个斐波那契数的公式,直到 4 的斐波那契类数列的下一项为 -
$$\mathrm{x_2\:=\:x_1\:+\:x_0\:=\:7\:+\:3\:=\:10}$$
$$\mathrm{x_3\:=\:x_2\:+\:x_1\:=\:10\:+\:7\:=\:17}$$
$$\mathrm{x_4\:=\:x_3\:+\:x_2\:=\:17\:+\:10\:=\:27}$$
上面数列的第 4 个数字,其前两个数字是 3 和 7,是 27,这是一个奇数。
接下来,我们需要找出斐波那契类数列的第 N 项是偶数还是奇数,其中我们将得到数列的前两个数字和 N 的值作为输入。
以下是我们可以遵循解决上述问题的方法。
方法
方法 1(使用数组)
这是解决此问题的最基本和最简单的方法。我们将像在示例输入中所做的那样找到数列的每个数字,直到 N,并将它们存储在数组中。然后,我们将检查第 N 个数字是偶数还是奇数,并相应地打印输出。
我们将遵循的方法的逐步说明 -
我们将创建一个函数来检查数列的第 N 项。
使用 C++ 中的 MAX 函数创建一个最大长度的数组。
使用 for 循环将数列的每个数字存储在数组中,直到 N。
检查数组中的第 N 项。如果它是偶数,则打印偶数,否则打印奇数。
示例
C++ 中方法的实现 -
#include <iostream> #include <bits/stdc++.h> using namespace std; //function to find out if the N-th term of the sequence is an even or odd number void evenOrodd(int x, int y, int N){ int arr[N+1]={0}; //create an array of size 200 //store value of x and y at 0th and 1st index of array arr[0]=x; arr[1]=y; for(int i=2;i<=N;i++){ //iterate through array until N and update corresponding //value of the sequence at ith index arr[i]=arr[i-1]+arr[i-2]; //using the formula } cout<<N<<"th term of the fibonacci-like sequence is : "; //to check if it is an even or odd if(arr[N]%2==0){ cout<<"Even"<<endl; } else { cout<<"Odd"<<endl; } } int main(){ int x=3, y=8, N=10; evenOrodd(x,y,N); x=7, y=13, N=6; evenOrodd(x,y,N); return 0; }
输出
10th term of the fibonacci-like sequence is : Even 6th term of the fibonacci-like sequence is : Odd
时间复杂度:O(N),因为我们迭代数组直到 N。
空间复杂度:O(N),因为我们创建了一个大小为 N+1 的数组。
方法 2(观察模式)
在这种方法中,我们将尝试了解斐波那契类数列的第 N 项背后的模式。由于数列的每一项都是前两项的和,因此第 N 项是偶数还是奇数取决于前两项。它们的性质将取决于它们的前两项。因此,第 N 项是偶数还是奇数的性质最终将取决于前两项。
在这种方法中将有四种情况 -
1. 前两项都是偶数。
2. 前两项都是奇数。
3. 第一项是偶数,第二项是奇数。
4. 第一项是奇数,第二项是偶数。
情况 1 - 在第一种情况下,两项都是偶数,即 $\mathrm{x_0}$ 和 $\mathrm{x_1}$。在这种情况下,数列中的任何数字都将仅为偶数,因为两个偶数的和始终为偶数。
例如,如果 $\mathrm{x_0}$=2 且 $\mathrm{x_1}$=4,则数列将为 2, 4, 6, 10, 16, 26, 42…。
情况 2 - 对于这种情况,前两项将是奇数。两个奇数的和将始终为偶数。因此,在这种情况下,$\mathrm{x_2}$ 将始终为偶数。此外,$\mathrm{x_3}$ 将为奇数,因为偶数和奇数的和将始终为奇数。让我们用一个例子来理解这个模式:$\mathrm{x_0}$=1 且 $\mathrm{x_1}$=3。因此,数列的下一项将为 $\mathrm{x_2}$=4, $\mathrm{x_3}$=7, $\mathrm{x_4}$=11, $\mathrm{x_5}$=18, $\mathrm{x_6}$=29, $\mathrm{x_7}$=47, $\mathrm{x_8}$=76…..
观察模式,我们可以观察到偶数在 N=2,5,8 处连续重复,可以用 3*a-1 表示,对于 a 的任何正值。因此,在这种情况下,$\mathrm{x_N}$ 将为偶数 N 可以表示为 (3*a-1),对于 a 的任何正值,否则对于所有其他情况,$\mathrm{x_N}$ 将为奇数。
情况 3 - 在这种情况下,第一项将为偶数,第二项将为奇数。任何偶数和奇数的和始终为奇数。下一项将为偶数,因为前两项为奇数。让我们尝试用一个例子来理解这种情况的模式,$\mathrm{x_0}$=2 且 $\mathrm{x_1}$=3。数列的接下来的几项将为,
$\mathrm{x_2}$=5, $\mathrm{x_3}$=8, $\mathrm{x_4}$=13, $\mathrm{x_5}$=21, $\mathrm{x_6}$=34, $\mathrm{x_7}$=55, $\mathrm{x_8}$=89, $\mathrm{x_9}$=144……
我们可以看到偶数仅在 3 的倍数处重复。因此,$\mathrm{x_N}$ 仅在 N 为 3 的倍数时为偶数,否则为奇数。
情况 4 - 这是第一项为奇数,第二项为偶数的情况。让我们用一个例子来研究这个模式,$\mathrm{x_0}$=1 且 $\mathrm{x_1}$=2。数列中的前几个数字将为,
$\mathrm{x_2}$=3, $\mathrm{x_3}$=5, $\mathrm{x_4}$=8, $\mathrm{x_5}$=13, $\mathrm{x_6}$=21, $\mathrm{x_7}$=34, $\mathrm{x_8}$=55, $\mathrm{x_9}$=89, $\mathrm{x_10}$=144……
观察模式,我们可以得出结论,偶数在 N=4,7,10…. 处连续重复。这些可以用 3*a+1 表示,对于 a 的任何正值或 0。我们可以说,如果 N 的形式为 (3*a+1),则数列的 𝑥𝑁 将为偶数,否则对于 N 的所有其他值,该数字将为奇数。
示例
C++ 中方法的实现 -
#include <iostream> #include <bits/stdc++.h> using namespace std; //function to check if N-th term of fibonacci-like sequence is even or odd void evenOrodd(int x,int y,int N){ if(N==0){ if(x%2==0) //to check if it is even cout<<"N-th term is : Even"<<endl; else cout<<"N-th term is : Odd"<<endl; return; } if(N==1){ if(y%2==0) cout<<"N-th term is : Even"<<endl; else cout<<"N-th term is : Odd"<<endl; return; } if(x%2==0){ //if x is even if(y%2==0){ //if y is even cout<<"N-th term is : Even"<<endl; } else{ if(N%3==0) //if one term is even and other is odd cout<<"N-th term is : Even"<<endl; else cout<<"N-th term is : Odd"<<endl; } return; } else { //if x is odd if(y%2!=0){ //if y is odd too if((N+1)%3==0) cout<<"N-th term is : Even"<<endl; else cout<<"N-th term is : Odd"<<endl; } else{ //if y is an even number if((N-1)%3==0) cout<<"N-th term is : Even"<<endl; else cout<<"N-th term is : Odd"<<endl; } return; } } int main(){ int x=6,y=10,N=7; evenOrodd(x,y,N); x=13, y=16, N=5; evenOrodd(x,y,N); return 0; }
输出
N-th term is : Even N-th term is : Odd
时间复杂度:O(1),因为检查需要常数时间。
空间复杂度:O(1),没有占用额外的空间。
结论
在本文中,我们学习了如何检查斐波那契类数列的第 N 项是偶数还是奇数。我们尝试使用两种不同的方法来解决此问题,在第一种方法中,我们使用数组找到直到 N 的数列并检查第 N 项,而在第二种方法中,我们尝试学习数列中遵循的模式。第二种方法是两种方法中最有效的方法,因为它需要常数时间。我希望本文能帮助您学习解决此问题的概念,并发现本文对您有所帮助。