相信在小学,找规律这些数学问题肯定烧掉了不少同学的CPU,对其可谓是恨之入骨。
举个栗子:
1,5,11,19,29,41,55,71,89,?
这里我也不买关子了,通项公式为,所以下一个数字应为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...即代表规律未找到,可能为数列项数过少,迭代次数不够;或为数列本身无规律;或为某些特殊数列无法求解(如斐波那契数列等)