permute.C

Go to the documentation of this file.
00001 // tutorial illustrating the use of TMath::Permute
00002 //  can be run with:
00003 // root > .x permute.C
00004 // root > .x permute.C+ with ACLIC
00005 //Author: Federico Carminati
00006    
00007 #include <TMath.h>
00008 
00009 int permuteSimple1 () 
00010 {
00011   printf("\nTMath::Permute simple test\n");
00012   printf("==========================\n");
00013   char aa='a';
00014   Int_t a[4];
00015   Int_t i;
00016   Int_t icount=0;
00017   for(i=0; i<4; i++) a[i]=i;
00018   do { 
00019     icount++;
00020     for(Int_t i=0;i<4;printf("%c",static_cast<char>(aa+a[i++]))); printf("\n");
00021   } while(TMath::Permute(4,a));
00022   printf("Found %d permutations = 4!\n",icount);
00023   return 0;
00024 }
00025 
00026 int permuteSimple2 () 
00027 {
00028   printf("\nTMath::Permute simple test with repetition\n");
00029   printf("==========================================\n");
00030   char aa='a'-1;
00031   Int_t a[6];
00032   Int_t i;
00033   Int_t icount=0;
00034   for(i=0; i<6; i++) a[i]=(i+2)/2;
00035   do { 
00036      icount++;
00037      for(Int_t i=0;i<5;printf("%c",static_cast<char>(aa+a[i++]))); printf("\n");
00038   } while(TMath::Permute(5,a));
00039   printf("Found %d permutations = 5!/(2! 2!)\n",icount);
00040   return 0;
00041 }
00042 
00043 Int_t permuteFancy() 
00044 {
00045   Int_t a[10];
00046   Int_t &n=a[0], &i=a[1];
00047   Int_t &e=a[2], &t=a[3];
00048   Int_t &h=a[4], &r=a[5];
00049   Int_t &f=a[6], &o=a[7];
00050   Int_t &s=a[8], &u=a[9];
00051   Int_t nine, three, neuf, trois;
00052 
00053   printf("\nTMath::Permute fancy test\n");
00054   printf("=========================\n");
00055   printf("This is a program to calculate the solution to the following problem\n");
00056   printf("Find the equivalence between letters and numbers so that\n\n");
00057   printf("              NINE*THREE = NEUF*TROIS\n\n");
00058   for(Int_t ii=0; ii<10; ii++) a[ii]=ii;
00059   do {
00060      nine=((n*10+i)*10+n)*10+e;
00061      neuf=((n*10+e)*10+u)*10+f;
00062      three=(((t*10+h)*10+r)*10+e)*10+e;
00063      trois=(((t*10+r)*10+o)*10+i)*10+s;
00064      if(nine*three==neuf*trois) {
00065         printf("Solution found!\n\n");
00066         printf("T=%d N=%d E=%d S=%d F=%d H=%d R=%d I=%d O=%d U=%d\n",t,n,e,s,f,h,r,i,o,u);
00067         printf("NINE=%d THREE=%d NEUF=%d TROIS=%d\n",nine,three,neuf,trois);
00068         printf("NINE*THREE = NEUF*TROIS = %d\n",neuf*trois);
00069         return 0;
00070      }
00071   } while(TMath::Permute(10,a));
00072   printf("No solutions found -- something is wrong here!\n");
00073   return 0;
00074 }
00075 
00076 void permute() {
00077    permuteSimple1();
00078    permuteSimple2();
00079    permuteFancy();
00080 }

Generated on Tue Jul 5 15:44:50 2011 for ROOT_528-00b_version by  doxygen 1.5.1