暴力得出数列的通项公式

#include<bits/stdc++.h>
using namespace std;

long long f[]={0, 1, 1, 2, 8, 18, 59, 155, 460, 1276, 3672, 10357, 29533};

int main()
{
    int len=sizeof(f)/sizeof(f[0]);
    int a,b,c,d,e,k;
    int  n=5;
    int start=-10,end=10;
    for(a=start;a<=end;a++){
        for(b=start;b<=end;b++){
            for(c=start;c<=end;c++){
                for(d=start;d<=end;d++){
                    for(e=start;e<=end;e++){
                        for(k=start;k<=end;k++){
                            if(f[n]==(a*f[n-1]+b*f[n-2]+c*f[n-3]+d*f[n-4]+e*f[n-5]+k)){
                                int flag=0;
                                for(int m=n;m<len;m++){
                                    if(!(f[m]==(a*f[m-1]+b*f[m-2]+c*f[m-3]+d*f[m-4]+e*f[m-5]+k))){
                                        flag=1;
                                        break;
                                    }
                                }
                                    if(flag==0){
                                        cout<<"ok!"<<endl;
                                        cout<<"a= "<<a<<" b= "<<b<<" c= "<<c<<" d= "<<d<<" e= "<<e<<" k= "<<k<<endl;
                                        cout<<"General formula:"<<endl;
                                        printf("f[n] = %d*f[n-1] + %d*f[n-2] + %d*f[n-3] + %d*f[n-4] + %d*f[n-5] + %d\n\n",a,b,c,d,e,k);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    return 0;
}

数列放入,会有 f[n]=a*f[n-1]+b*f[n-2]+c*f[n-3]+d*fn-4]+e*f[n-5]+k 的通项公式输出,结果可能有多个,不过在小系数的情况下基本上都应该是属于等价的,start,end调节爆破范围,视个人机器和时间决定,本人上述代码1s。

放个改进版的吧,不私藏了:

#include<bits/stdc++.h>
using namespace std;

long long f[]={0, 1, 1, 2, 8, 18, 59, 155, 460, 1276, 3672, 10357, 29533};
class re{
public:
    int r[6];
    int num=0;
    int len=6;
    re(int _a,int _b,int _c,int _d,int _e,int _k)
    {
    int in=0;
    r[in++]=_a;
    r[in++]=_b;
    r[in++]=_c;
    r[in++]=_d;
    r[in++]=_e;
    r[in++]=_k;
       for(int i=0;i<6;i++)
        {
        if(r[i]==0)
            num++;
       }
       for(int i=5;i>=0;i--){
       	if(r[i]!=0)break;
       	else len--;
	   }
    }
};

bool comp(re a,re b){
	if(a.len<b.len)return true;
	if(a.len>b.len)return false;
    if(a.num>b.num)return true;
    if(a.num<b.num)return false;
    else {
        for(int i=0;i<6;i++){
            if(a.r[i]!=0&&b.r[i]==0){
                return true;
            }
            if(a.r[i]==0&&b.r[i]!=0){
                return false;
            }
        }
    }
    return false;
}
vector<re> t;

int main()
{
    int len=sizeof(f)/sizeof(f[0]);
    int a,b,c,d,e,k;
    int  n=5;
    int start=-10,end=10;
    for(a=start;a<=end;a++){
        for(b=start;b<=end;b++){
            for(c=start;c<=end;c++){
                for(d=start;d<=end;d++){
                    for(e=start;e<=end;e++){
                        for(k=start;k<=end;k++){
                            if(f[n]==(a*f[n-1]+b*f[n-2]+c*f[n-3]+d*f[n-4]+e*f[n-5]+k)){
                                int flag=0;
                                for(int m=n;m<len;m++){
                                    if(!(f[m]==(a*f[m-1]+b*f[m-2]+c*f[m-3]+d*f[m-4]+e*f[m-5]+k))){
                                        flag=1;
                                        break;
                                    }
                                }
                                    if(flag==0){
                                    	/* //show everytimes
                                        cout<<"ok!"<<endl;
                                        cout<<"a= "<<a<<" b= "<<b<<" c= "<<c<<" d= "<<d<<" e= "<<e<<" k= "<<k<<endl;
                                        cout<<"General formula:"<<endl;
                                        printf("f[n] = %d*f[n-1] + %d*f[n-2] + %d*f[n-3] + %d*f[n-4] + %d*f[n-5] + %d\n\n",a,b,c,d,e,k);                                      
					*/
					re p=re(a,b,c,d,e,k);
                                        t.push_back(p);
                                        
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        sort(t.begin(),t.end(),comp);
        cout<<"Over!This maybe the best method!"<<endl;
        int ind=5;
        printf("f[n] = %d*f[n-1] + %d*f[n-2] + %d*f[n-3] + %d*f[n-4] + %d*f[n-5] + %d\n\n",t[0].r[ind--],t[0].r[ind--],t[0].r[ind--],t[0].r[ind--],t[0].r[ind--],t[0].r[ind--]);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值