java

位置:IT落伍者 >> java >> 浏览文章

java实现10个数的全排列的应用


发布日期:2021年09月17日
 
java实现10个数的全排列的应用
在校园网的论坛上看到的一些题目放假了没有什么事做就想到了自己来试着做一些到今天 才总是把它给做成了我想要实现的结果了有时候就是那样做了好久都没办法做出来到灵感来了的那一下一下子就可以做出来心里有点高兴在这个过程中我对JAVA的IO了解得比以前多了一点虽然还不是很熟悉但大概也知道怎么用了

如下

给定等式A B C D E 其中每个字母代表一个数字且不同数字对应不

D F G 同字母编程求出这些数字并且打出这个数字的

+D F G 算术计算竖式

───────

语句X Y Z D E

下面是我自己的JAVA代码里面有很大一段是人家写的个数的全排列我只是把修改成了JAVA

importjavaio*;

publicclassPaiLei{

staticintcount=;

privatechar[]symbol={ABCDEFGXYZ};

int[]num={};

publicvoidcheck(){

//Systemoutprint(进来了呀);

//temp表示数字ABCDE

inttemp=num[]*+num[]*+num[]*+num[]*+num[];

//temp表示数字DFG

inttemp=num[]*+num[]*+num[];

//temp表示数字XYZDE

inttemp=num[]*+num[]*+num[]*+num[]*+num[];

//判断表达式是不是成立

//Systemoutprint(进入循环);

if((temp+temp*)==temp){

count++;

Systemoutprintln(temp+temp+temp);

Systemoutprintln(temp);

Systemoutprintln(+count+种答案);

print();

}

}

//function方法是核心方法就是求个数的全排列

/***//**

:将到N的N个自然数排成一列共有**……*N种不同的排列方法

N=种排列方案分别为试编程序输出

到N的全部排列假设N<为了设计出由计算机输出到N的全部排列程序

就必须寻找不同排列之间的规律通过观察N=(参见本例的运行结果)的排

列情况可以发现如果把每个排列看作一个自然数则所有排列对应的数是

按从小到大的顺序排列从当前的排列产生下一个排列时必然会造成某一位

置上的数字变大这一位置显然应该尽量靠右并且在它左边位置上的数字保

持不变这就意味着这一位置变成的数字来自于它的右边并且变大的幅度

要尽可能小也就是说在它右边如有几个数同时比它大时应该用其中最小的

来代替它由于这一位置是满足上述条件的最右边的一位所以在它右边的所

有数字按逆序排列即在这些数字的右边没有一个大于它的数程序中先从右

至左找到第一个位置该位置上的数比它右边的数小这个位置就是所要找的

满足上述条件的位置然后再从右到左找到第一个比该位置上的数字大的数

字所在的位置将这两个位置上的数字交换再将该位置右边的所有元素颠倒

过来即将它们按从小到大的顺序排列就得到了下一个排列

结果应该是

Inputn:

#include<iostream>

usingnamespacestd;

voidmain(){

intn;//n个数字的排列;

cout<<input:;

cin>>n;

int*p=newint[n];//数组保存各位数字;

for(inti=;i<n;i++)//初始化为第一个排列;

p[i]=i+;

do{

for(i=;i<n;i++)//输出排列中的数字

cout<<p[i]<<;

cout<<endl;

for(intj=n;j>;j)//从右向左;找要交换的位置(j);

if(p[j]>p[j])break;

if(j==)break;//找不到要交换的位置退出do

j;

for(intk=n;k>j;k)//在位置右边;从右向左;

//找要交换的位置(k);

if(p[k]>p[j])break;

swap(p[k]p[j]);//交换位置和位置的值;

//把位置后边的所有位反序排列;

for(intx=j+y=n;x<y;x++y)

swap(p[x]p[y]);

}while();

delete[]p;

}

*/

publicvoidfunction()throwsIOException{

intitempj;

do{

check();

//write();

for(i=;i>;i){

if(num[i]>num[i])

break;

}

if(i==)

break;

i;

for(j=;j>i;j){

if(num[j]>num[i])break;

}

temp=num[j];

num[j]=num[i];

num[i]=temp;

//下面循环是

for(intx=i+y=;x<y;x++y){

temp=num[x];

num[x]=num[y];

num[y]=temp;

}

}while(true);

}

//输出正确结果的方法

publicvoidprint(){

for(intj=;j<=;j++){

//输出ABCDEFGXYZ

Systemoutprint(symbol[j]+);

}

Systemoutprintln();

for(intj=;j<=;j++){

//输出他们对应的值

Systemoutprint(num[j]+);

}

Systemoutprintln();

Systemoutprintln(+num[]+num[]+num[]+num[]+num[]);

Systemoutprintln(+num[]+num[]+num[]);

Systemoutprintln(++num[]+num[]+num[]);

Systemoutprintln(+num[]+num[]+num[]+num[]+num[]);

Systemoutprintln();

}

//将所有排列写入记事本

publicvoidwrite()throwsIOException{

Filemyfile=newFile(d:\paieitxt);

FileOutputStreamout=newFileOutputStream(myfiletrue);

DataOutputStreamout=newDataOutputStream(out);

byte[]temp={};

for(bytei=;i<=;i++){

temp[i]=(byte)num[i];//num数组是一个int型

outwriteByte(temp[i]+);

PrintStreamout=newPrintStream(out);

outprint();

//outclose();

}

PrintStreamout=newPrintStream(out);

outprintln();

//outclose();

//==============下面几行注释了的是向控治台输出显示

//ByteArrayInputStreamin=newByteArrayInputStream(temp);

//intdata=inread();

//while(data!=){

////outwrite(temp);

//Systemoutprint(+data);

//data=inread();

//}

//Systemoutprint( );

//inclose();

outclose();

}

publicstaticvoidmain(String[]args)throwsIOException{

PaiLeip=newPaiLei();

pfunction();

}

}

               

上一篇:通过E-mail共享Java 对象

下一篇:Java类的热替换——概念、设计与实现