科技行者

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

知识库

知识库 安全导航

至顶网软件频道基础软件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();
            
        }
   
    
}

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

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