科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件java实现10个数的全排列的应用

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

将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();
            
        }
   
    
}

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊搁崐椋庢閿熺姴鐭楅幖娣妼缁愭鏌¢崶鈺佷汗闁哄閰i弻鏇$疀鐎n亞浠炬繝娈垮灠閵堟悂寮婚弴锛勭杸閻庯綆浜栭崑鎾诲冀椤撱劎绋忛梺璺ㄥ櫐閹凤拷

    濠电姷鏁告慨鐑姐€傛禒瀣劦妞ゆ巻鍋撻柛鐔锋健閸┾偓妞ゆ巻鍋撶紓宥咃躬楠炲啫螣鐠囪尙绐為梺褰掑亰閸撴盯鎮惧ú顏呪拺闂傚牊鍗曢崼銉ョ柧婵犲﹤瀚崣蹇旂節婵犲倻澧涢柛瀣ㄥ妽閵囧嫰寮介妸褋鈧帡鏌熼挊澶婃殻闁哄瞼鍠栭幃婊堝煛閸屾稓褰嬮柣搴ゎ潐濞叉ê鐣濈粙璺ㄦ殾闁割偅娲栭悡娑㈡煕鐏炲墽鐭嬫繛鍫熸倐濮婄粯鎷呯粵瀣異闂佹悶鍔嬮崡鍐茬暦閵忋倕鍐€妞ゆ劑鍎卞皬闂備焦瀵х粙鎴犫偓姘煎弮瀹曚即宕卞Ο闀愮盎闂侀潧鐗嗛幊搴㈡叏椤掆偓閳规垿鍩ラ崱妞剧凹濠电姰鍨洪敋閾荤偞淇婇妶鍛櫤闁稿鍊圭换娑㈠幢濡纰嶉柣搴㈣壘椤︾敻寮诲鍫闂佸憡鎸鹃崰搴敋閿濆鏁嗗〒姘功閻绻涢幘鏉戠劰闁稿鎹囬弻锝呪槈濞嗘劕纾抽梺鍝勬湰缁嬫垿鍩為幋锕€宸濇い鏇炴噺閳诲﹦绱撻崒娆戝妽妞ゃ劌鎳橀幆宀勫磼閻愰潧绁﹂柟鍏肩暘閸斿矂鎮為崹顐犱簻闁圭儤鍨甸鈺呮倵濮橆剦妲归柕鍥у瀵粙濡歌閸c儳绱撴担绛嬪殭婵☆偅绻堝濠氭偄绾拌鲸鏅i悷婊冪Ч閹﹢鎳犻鍌滐紲闁哄鐗勯崝搴g不閻愮儤鐓涢悘鐐跺Г閸犳﹢鏌℃担鐟板鐎规洜鍠栭、姗€鎮╅搹顐ら拻闂傚倷娴囧畷鍨叏閹惰姤鈷旂€广儱顦崹鍌炴煢濡尨绱氶柨婵嗩槸缁€瀣亜閺嶃劎鈽夋繛鍫熺矒濮婅櫣娑甸崨顔俱€愬銈庡亝濞茬喖宕洪埀顒併亜閹哄棗浜鹃梺鎸庢穿婵″洤危閹版澘绫嶉柛顐g箘椤撴椽姊虹紒妯哄鐎殿噮鍓欒灃闁告侗鍠氶崢鎼佹⒑閸撴彃浜介柛瀣閹﹢鏁冮崒娑氬幈闁诲函缍嗛崑鍡樻櫠椤掑倻纾奸柛灞剧☉缁椦囨煙閻熸澘顏柟鐓庢贡閹叉挳宕熼棃娑欐珡闂傚倸鍊风粈渚€骞栭銈傚亾濮樺崬鍘寸€规洖缍婇弻鍡楊吋閸涱垽绱遍柣搴$畭閸庨亶藝娴兼潙纾跨€广儱顦伴悡鏇㈡煛閸ャ儱濡煎褜鍨伴湁闁绘ǹ绉鍫熺畳闂備焦瀵х换鍌毼涘Δ鍛厺闁哄洢鍨洪悡鍐喐濠婂牆绀堟慨妯挎硾閽冪喖鏌曟繛褍瀚烽崑銊╂⒑缂佹ê濮囨い鏇ㄥ弮閸┿垽寮撮姀鈥斥偓鐢告煥濠靛棗鈧懓鈻嶉崶銊d簻闊洦绋愰幉楣冩煛鐏炵偓绀嬬€规洟浜堕、姗€鎮㈡總澶夌处

    重磅专题
    往期文章
    最新文章