以反射Gray碼的順序生成0,1的n元組的演算法-組合數學
以反射Gray碼的順序生成0,1的n元組的演算法
演算法步驟如下:
從n元組a[n-1]a[n-2]...a[0]=00...0開始;
當a[n-1]a[n-2]...a[0]!=00...0時,執行下面操作:
①計算sum=a[n-1]+a[n-2]+...+a[0];
②如果sum是偶數,則改變a[0](從0變到1或是從1變到0);
③否則,確定這樣的j,使得a[j]=1且滿足j>i的所有i有a[i]=0(即這是從左邊開始第一個1),然後,改變a[j+1](從0變到1或是從1變到0)。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <bitset>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 10010
int a[maxn];
int n;
void Init()
{
memset(a,0,sizeof(a));
}
bool Check()//檢查是否a[n-1]==1且其它全為0
{
if(a[n-1]!=1) return false;
for(int i=0; i<n-1; ++i)
if(a[i]!=0) return false;
return true;
}
int Sum()//陣列a所有元素之和
{
int sum=0;
for(int i=0; i<n; ++i)
sum+=a[i];
return sum;
}
void Change()//取反第一個1之前一位的數值
{
for(int i=0; i<n; ++i)
if(a[i]==1)
{
a[i+1]=!a[i+1];
break;
}
}
void Out()//輸出陣列a
{
for(int i=n-1; i>=0; --i)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
cin>>n;
Init();//初始化全部置零
while(!Check())
{
Out();//輸出陣列a
if(Sum()%2==0)//若所有元素之和為偶數
a[0]=!a[0];//取反a[0]
else if(Sum()%2==1)//若所有元素之和為奇數
Change();//取反第一個1之前一位的數值
}
Out();//輸出陣列a
return 0;
}
相關文章
- 按字典序生成{1,2,...,n}的r子集的演算法-組合數學演算法
- 生成{1,2,...,n}的排列的演算法-組合數學演算法
- HDU 2582 f(n) (組合數的gcd)GC
- 【數學】組合數學 - 排列組合
- 【演算法學習】組合數學演算法
- 求自然數的組合數的回溯演算法演算法
- 組合數學
- 函式組合的 N 種模式函式模式
- 生成組合物件之二進位制反射格雷碼(c++)物件反射C++
- 組合數學筆記-排列與組合筆記
- 《小 學 組 合 數 學》
- java反射——運算元組Java反射
- 【數學】組合數學 - 卡特蘭數
- 【組合數學】組合數學簡介 ( 組合思想 2 : 數學歸納法 | 數學歸納法推廣 | 多重歸納思想 )
- 遞迴示例-指定數字以內的所有排列組合(Reduce)遞迴
- 異構OS平臺的不同點 - 位元組順序
- python 多型、組合、反射Python多型反射
- 51微控制器程式框架之帶順序的組合按鍵觸發框架
- 【學習筆記】組合數學筆記
- 組合數學學習筆記筆記
- 不學無數——組合模式模式
- 組合數學 XKerror 筆記Error筆記
- 演算法學習筆記(16): 組合數學基礎演算法筆記
- 【總結】求組合數的方法
- Modbus通訊協議中的四種位元組順序協議
- 【演算法學習筆記】組合數與 Lucas 定理演算法筆記
- [學習筆記]分組資料以及on/where/having的順序問題筆記
- 15.7 冪級數在組合數學中的應用
- 【POJ 2249】 Binomial Showdown 組合數學 排列組合計算
- js運算元組中資料排列組合JS
- 組合數學水題 $19$ 道
- 組合數取模的幾種方法--Exlucas&楊輝三角&組合
- 位元組面試演算法題-0,1揹包問題面試演算法
- java基礎:遍歷m取n的所有組合(轉)Java
- 自動生成介面各種逆向組合引數
- python的元組Python
- 組合數學筆記-特殊計數數列筆記
- 程式碼隨想錄演算法訓練營第22天 | 77.組合 216.組合總和 17.電話號碼的字母組合演算法