数列找规律 - 原创新算法

相信在小学,找规律这些数学问题肯定烧掉了不少同学的CPU,对其可谓是恨之入骨。

举个栗子:

1,5,11,19,29,41,55,71,89,?

这里我也不买关子了,通项公式为n = i^2 + i -1,所以下一个数字应为109。

但你们肯定会吐槽,那关键性的问题还是没有解决啊……

哪道找规律的题目会良心泛滥地告诉你通项公式啊……

但是CPU被烧烤多年的我发现了一个规律(不喜勿喷

对每两个相邻数字做差得到一个新的数列,如栗子中则是4,6,8,10……

随后重复上一步操作(对每两个相邻数字做差得到一个新的数列)直到该数列每一个数字相同,如栗子中则是2,2,2,2……(注意,每一步操作后需记录所产生数列中的最后一项,可另开一数组记录)

随后,记录该数字,将其与之前每一步操作后所产生数列中的最后一项累加最后一项,当重复计算迭代至所产生数列仅有一项时,则判定为规律寻找失败。

我知道你们肯定不想写代码,故C++代码奉上:

#include<bits/stdc++.h>
using namespace std;
long long b[10009]; 
long long b2[10009]; 
long long bgl[1009];
int main()
{
	int n;
	cout<<"n:";
	cin>>n;
	bool ans_sm;
	cout<<"small_answer:";
	cin>>ans_sm;
	bool ab = 0;
		for(int i = 1;i <= n;i++){
			cin>>b[i];
			if(i == n){
				bgl[0] = b[i];
			}
		}
		int di = 0;
		while(n != 0){
			di++;
			n--;
			int same;
			bool issame = 1;
			for(int i = 1;i <= n;i++){
				if(!ab){
					if(i == n){
						bgl[di] = b[i+1] - b[i];
					}
					if(i == 1){
						same = b[i+1] - b[i];
					}
					if(b[i+1] - b[i] != same){
						issame = 0;
					}
					b2[i] = b[i+1] - b[i];
				}
				else{
					if(i == n){
						bgl[di] = b2[i+1] - b2[i];
					}
					if(i == 1){
						same = b2[i+1] - b2[i];
					}
					if(b2[i+1] - b2[i] != same){
						issame = 0;
					}
					b[i] = b2[i+1] - b2[i];
				}
			}
			if(n == 1){
				cout<<"Not find...\n";
				break;
			}
			if(issame == 1){
				if(!ans_sm) cout<<"\nfind! Is:"<<same<<endl;
				long long sum = 0;
				for(int i = 0;i <= di;i++){
					sum += bgl[i];
				}
				cout<<"The next is "<<sum<<".";
				break;
			}
			if(!ab){
				memset(b,0,sizeof(b));
			}
			else{
				memset(b2,0,sizeof(b2));
			}
			if(!ans_sm){
				for(int i = 1;i <= n;i++){
					if(!ab){
						cout<<b2[i]<<" ";
					}
					else{
						cout<<b[i]<<" ";
					}
				}
				cout<<endl;				
			}
			ab = !ab;
		}
	return 0;
}

输入解释:n代表初始数列长度,small_answer指是否简化输出结果,1是0否。

输出解释:输出The next is 某数 即代表规律已找到,某数代表原始数列按规律的下一数字。

                  输出Not find...即代表规律未找到,可能为数列项数过少,迭代次数不够;或为数列本身无规律;或为某些特殊数列无法求解(如斐波那契数列等)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值