先看以下代码:
#include<bits/stdc++.h>
#define ll long long
#define un unsigned
using namespace std;
ll a[500005];
ll x[500005];
void init(){for(int i=1;i<=500000;i++){x[i]=__builtin_popcount(i); }
}
int main(){init();for(int i=1;i<=500000;i++){cout<<x[i]<<" ";if(i%4==0) cout<<endl; }return 0;
}
这个代码是从1开始,把每个数都转成二进制,再输出二进制中一的个数(按每行四个数的格式,这样能发现一些规律)
运行结果(部分):
1 1 2 1
2 2 3 1
2 2 3 2
3 3 4 1
2 2 3 2
3 3 4 2
3 3 4 3
4 4 5 1
2 2 3 2
3 3 4 2
3 3 4 3
4 4 5 2
3 3 4 3
4 4 5 3
4 4 5 4
5 5 6 1
首先,每行的前两个数都是相同的,而每当每行最后一个数与前两个数相等时,第一、二、三个数都加了一,在某种条件下(我也不知道是什么)他会跳回前面的某一行,再往后找。
还有一个令我惊讶的事,把目光锁定最后一列,会发现最后一列的序列与整个序列是一样的。
其实前三列是整个序列的子序列(除第一行外)
以上为个人所总结,目前没发现什么具体规律(要转载请标注原创)