C++
#include<iostream> using namespace std; int num[10]; bool dir[10]; __int64 Array[3628805]; int find()//找出排列数中活跃的项 { int Max=-1; int index=-1; for(int i=0;i<10;i++) { if(dir[num[i]]==1) { if(i!=0) { if(num[i]>num[i-1]) { if(num[i]>Max) { Max=num[i]; index=i; } } } }else { if(i!=9) { if(num[i]>num[i+1]) { if(num[i]>Max) { Max=num[i]; index=i; } } } } } return index; } void changedir(int n)//改变排列数方向 { for(int i=n+1;i<10;i++) dir[i]=!dir[i]; } void Print(int cnt)//转换成整型 { Array[cnt]=0; for(int i=0;i<10;i++) Array[cnt]=Array[cnt]*10+num[i]; } int main() { freopen("out.txt","w",stdout); for(int i=0;i<10;i++) { dir[i]=1; num[i]=i; } int cnt=1; while(1) { Print(cnt-1); int index=find(); if(index==-1)//最后一个排列已经生成则返回-1 退出 break; int N=num[index]; if(dir[N]==1) swap(num[index],num[index-1]); else swap(num[index],num[index+1]); changedir(N);//反转排列数中大于N的数方向 cnt++; } printf("cnt = %d\n",cnt); for(int i=0;i<cnt;i++) printf("%I64d\n",Array[i]); return 0; }