用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1,20...用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1

来源:学生作业帮助网 编辑:六六作业网 时间:2024/05/04 12:40:13
用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1,20...用C++编程求出数列的所有升或降的最大子序列.如下面

用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1,20...用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1
用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1,20...
用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1,20,30),(30,12,3),(3,5,7),(7,4),(4,6,100),(100,11,8)\x0c\x0c我是初学者,请高手帮个忙,

用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1,20...用C++编程求出数列的所有升或降的最大子序列.如下面数列?1,20,30,12,3,5,7,4,6,100,11,8\x0c的解为?(1
我给你讲一下思路:
在Fibonacci数列中,F[0]=0,F[1]=1,F[n]=F[n-1]+F[n-2](n>=2).举例来说,Fibonacci数列的前十个数是
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
我们可以用利用矩阵乘法来计算Fibonacci的第n项 :
|F[n+1] F[n] | = |1 1|.|1 1|.|1 1|...共n个
|F[n] F[n-1] | |1 0| |1 0| |1 0|
用这个方法就可以避免递归了.
我以前写了一个程序,因为为了避免高精度的麻烦,就直接取的是斐波那契数列的后四位.你看看,把它改成高精度就可以了.
#include<iostream>
//#include<cmath>
#include<memory>
using namespace std;
int i,c[10001];
int a[2][2]=,};
int b[2][2];
void trial(int n)
{
if(n==1) return;
else{
if(n%2==1)
{
c[i]=1;i++;trial(n-1);
}
if(n%2==0)
{
c[i]=2;i++;trial(n/2);
}
}
}
void fib(int n)
{
int i,j;
memset(c,0,sizeof(c));
trial(n);
for(i=10000;i>=0;i--)
{
if(c[i]!=0)break;
}
for(j=i;j>=0;j--)
{
if(c[j]==1)
{
b[0][1]=a[0][0]%10000;
b[0][0]=(a[0][0]+a[0][1])%10000;
b[1][1]=a[0][1]%10000;
a[0][1]=b[0][1];
a[0][0]=b[0][0];
a[1][1]=b[1][1];
}
if(c[j]==2)
{
b[0][0]=(a[0][0]*a[0][0]+a[0][1]*a[0][1])%10000;
b[0][1]=(a[0][0]*a[0][1]+a[0][1]*a[1][1])%10000;
b[1][1]=(a[1][1]*a[1][1]+a[0][1]*a[0][1])%10000;
a[0][0]=b[0][0];
a[0][1]=b[0][1];
a[1][1]=b[1][1];
}
}
}
int main()
{
int N;
cin>>N;
if(N==0)
fib(N);
cout<<a[0][1];
return 0;
}