将1到N的N个自然数排成一列,共有1*2*3……*N种不同的排列方法,如
N=3时, 有6种排列方案,分别为,123,132,213,231,312,321.试编程序输出1
到N的全部排列,假设N<10.
作者:中国IT实验室 来源:中国IT实验室 2007年8月23日
关键字: 全排列 java
在校园网的论坛上看到的一些题目,放假了没有什么事做就想到了自己来试着做一些,到今天 才总是把它给做成了我想要实现的结果了,有时候就是那样,做了好久,都没办法做出来,到灵感来了的那一下,一下子就可以做出来,心里有点高兴。在这个过程中,我对JAVA的IO了解得比以前多了一点,虽然还不是很熟悉,但大概也知道怎么用了,
如下:
1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
───────
语句; X Y Z D E
下面是我自己的JAVA代码,里面有很大一段是人家写的10个数的全排列,我只是把修改成了JAVA
import java.io.*;
public class PaiLei...{
static int count=0;
private char[] symbol=...{'A','B','C','D','E','F','G','X','Y','Z'} ;
int [] num=...{0,1,2,3,4,5,6,7,8,9};
public void check()...{
//System.out.print("进来了呀");
//temp1 表示数字ABCDE
int temp1=num[0]*10000+num[1]*1000+num[2]*100+num[3]*10+num[4];
//temp2表示数字DFG
int temp2=num[3]*100+num[5]*10+num[6];
//temp3表示数字XYZDE
int temp3=num[7]*10000+num[8]*1000+num[9]*100+num[3]*10+num[4];
//判断表达式是不是成立
//System.out.print("进入循环");
if((temp1+temp2*2)==temp3)...{
count++;
System.out.println(temp1+temp2+temp2);
System.out.println(temp3);
System.out.println("第"+count+"种答案");
print();
}
}
//function方法是核心方法,就是求10个数的全排列
/** *//**
例4:将1到N的N个自然数排成一列,共有1*2*3……*N种不同的排列方法,如
N=3时, 有6种排列方案,分别为,123,132,213,231,312,321.试编程序输出1
到N的全部排列,假设N<10. 为了设计出由计算机输出1到N的全部排列程序,
就必须寻找不同排列之间的规律. 通过观察N=5(参见本例的运行结果)的排
列情况,可以发现,如果把每个排列看作一个自然数, 则所有排列对应的数是
按从小到大的顺序排列,从当前的排列产生下一个排列时必然会造成某一 位
置上的数字变大,这一位置显然应该尽量靠右,并且在它左边位置上的数字保
持不变,这就意味着这一位置变成的数字来自于它的右边, 并且变大的幅度
要尽可能小,也就是说在它右边如有几个 数同时比它大时,应该用其中最小的
来代替它.由于这一位置是满足上述条件的最右边的一位 ,所以在它右边的所
有数字按逆序排列,即在这些数字的右边没有一个大于它的数.程序中先从右
至左找到第一个位置,该位置上的数比它右边的数小,这个位置就是所要找的
满足上述条件的位置, 然后再从右到左找到第一个比该位置上的数字大的数
字所在的位置,将这两个位置上的数字交换,再将该位置右边的所有元素颠倒
过来,即将它们按从小到大的顺序排列,就得到了下一个排列.
结果应该是:
Input n:5
12345 12354 12435 12453 12534 12543 13245 13254 13425 13452
13524 13542 14235 14253 14325 14352 14523 14532 15234 15243
15324 15342 15423 15432 21345 21354 21435 21453 21534 21543
23145 23154 23415 23451 23514 23541 24135 24153 24315 24351
24513 24531 25134 25143 25314 25341 25413 25431 31245 31254
31425 31452 31524 31542 32145 32154 32415 32451 32514 32541
34125 34152 34215 34251 34512 34521 35124 35142 35214 35241
35412 35421 41235 41253 41325 41352 41523 41532 42135 42153
42315 42351 42513 42531 43125 43152 43215 43251 43512 43521
45123 45132 45213 45231 45312 45321 51234 51243 51324 51342
51423 51432 52134 52143 52314 52341 52413 52431 53124 53142
53214 53241 53412 53421 54123 54132 54213 54231 54312 54321
#include<iostream>
using namespace std;
void main(){
int n; //n个数字的排列;
cout<<"input:";
cin>>n;
int *p=new int[n]; //数组保存各位数字;
for(int i=0;i<n;i++) //初始化为第一个排列;
p[i]=i+1;
do{
for(i=0;i<n;i++) //输出排列中的数字
cout<<p[i]<<" ";
cout<<endl;
for(int j=n-1;j>0;j--) //从右向左;找要交换的位置1(j);
if(p[j]>p[j-1]) break;
if(j==0)break; //找不到要交换的位置.退出do
j--;
for(int k=n-1;k>j;k--) //在位置1右边;从右向左;
//找要交换的位置2(k);
if(p[k]>p[j])break;
swap(p[k],p[j]); //交换位置1和位置2的值;
//把位置1后边的所有位反序排列;
for(int x=j+1,y=n-1;x<y;x++,y--)
swap(p[x],p[y]);
}while(1);
delete []p;
}
*/
public void function()throws IOException...{
int i,temp,j;
do...{
check();
//write();
for(i=9;i>0;i--)...{
if(num[i]>num[i-1])
break;
}
if(i==0)
break;
i--;
for(j=9;j>i;j--)...{
if(num[j]>num[i]) break;
}
temp= num[j];
num[j]=num[i];
num[i]=temp;
//下面循环是
for(int x=i+1,y=9;x<y;x++,y--)...{
temp=num[x];
num[x]=num[y];
num[y]=temp;
}
}while(true);
}
//输出正确结果的方法
public void print()...{
for(int j=0;j<=9;j++)...{
//输出ABCDEFGXYZ
System.out.print(symbol[j]+" ");
}
System.out.println();
for(int j=0;j<=9;j++)...{
//输出他们对应的值
System.out.print(num[j]+" ");
}
System.out.println();
System.out.println(" "+num[0]+num[1]+num[2]+num[3]+num[4]);
System.out.println(" "+num[3]+num[5]+num[6]);
System.out.println(" + "+num[3]+num[5]+num[6]);
System.out.println(" "+num[7]+num[8]+num[9]+num[3]+num[4]);
System.out.println();
}
//将所有排列写入记事本
public void write()throws IOException...{
File myfile=new File("d:\paiei.txt");
FileOutputStream out=new FileOutputStream(myfile,true);
DataOutputStream out1=new DataOutputStream(out);
byte[] temp=...{0,0,0,0,0,0,0,0,0,0};
for(byte i=0;i<=9;i++)...{
temp[i]=(byte)num[i]; //num数组是一个int型
out1.writeByte(temp[i]+48);
PrintStream out2=new PrintStream(out);
out2.print(" ");
// out2.close();
}
PrintStream out2=new PrintStream(out);
out2.println();
// out2.close();
//==============下面几行注释了的是,向控治台输出显示
// ByteArrayInputStream in=new ByteArrayInputStream(temp);
// int data=in.read();
// while(data!=-1){
// //out.write(temp);
// System.out.print(" "+data);
// data=in.read();
// }
// System.out.print(" ");
// in.close();
out1.close();
}
public static void main(String [] args) throws IOException...{
PaiLei p=new PaiLei();
p.function();
}
}
查看本文来源