2017-10-26 6 views
-1

私はこのコードをC#に変換したいが、何かが間違っている。私は指針でそれをしたくなかった。すぐに改善する方法を誰かが知ることができますか?これは、最小転置数によって全ての置換を生成することである。これは私が変換したいコードです。 a link。新しい配列を作成しませんint[] I = P;最小転置番号ですべての置換を生成するC - > C#

namespace Algorytm8 
{ 
    class Program 
    { 
     private int[] P; 
     private int count, n; 
     public int silnia(int n) {  
      return (n == 1 || n == 0) ? 1: silnia(n-1) * n;  
     } 
     public void swap(int i, int j) 
     { 
      int pom; 
      pom = P[i]; 
      P[i] = P[j]; 
      P[j] = pom; 
     } 
     public int b(int m, int i) 
     { 
      if ((m % 2 == 0) && (m > 2)) 
      { 
       if (i < m - 1) 
       { 
        return i; 
       } 
       else 
       { 
        return m - 2; 
       } 
      } 
      else 
      { 
       return m - 1; 
      } 
     }  
     public void perm(int m) 
     { 
      int Mi; 
      int[] I = P;  
      for (int i = 1; i <= m; i++) 
      { 
       I[i] = 1; 
      } 
      Mi = 1; 
      while (count < silnia(m)) 
      { 
       if (I[Mi]==Mi) 
       { 
        if (I[Mi]==1 && Mi==1) 
        { 
         count++; 
         Console.Write(count); 
         for (int i = 1; i <= n; i++) 
         { 
          Console.Write(P[i]); 
         } 
         Console.Write("\n"); 
        } 
        for (int i = 1; i <= Mi; i++) 
        { 
         I[i] = 1; 
        } 
        Mi++;  
       } 
       if (I[Mi] < Mi) 
       {  
        int i = I[Mi]; 
        swap(b(Mi, i), Mi); 
        I[Mi]++; 
        Mi = 1;       
       }  
      }    
     } 
     public void getData() 
     { 
      Console.WriteLine("Podaj ilość elementów: "); 
      int n = Int32.Parse(Console.ReadLine()); 
      P = new int[n]; 
      for (int i = 0; i < n; i++) 
      { 
       P[i] = i + 1; 
      } 
      perm(n - 1); 
     } 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.getData(); 
      Console.ReadKey(); 
     } 
    } 
} 
+1

何が問題になりますか? – NetMage

+0

悪い値は私を列挙します –

+0

それからデバッガーをとり、それをデバッグしてください。 – zerkms

答えて

0

は、私はそれがC#

あなたが持っていたいくつかの主要な問題のために、容易ではなく変換Cプログラム貼り付け/コピーします。 int n = Int32.Parse(Console.ReadLine());n = Int32.Parse(Console.ReadLine());に変更してください。コンパイラは、初期化について警告を出しているはずです。

swapswap(ref int i, ref int j)に変更してください。これはCバージョンによく似ており、より一般化されています。

class Program 
{ 
    private int[] P; 
    private int count, n; 

    public int silnia(int n) 
    { 
     return (n == 1 || n == 0) ? 1 : silnia(n - 1) * n; 
    } 

    public void swap(ref int i, ref int j) 
    { 
     int temp = i; 
     i = j; 
     j = temp; 
    } 

    public int B(int m, int i) 
    { 
     if ((m % 2 == 0) && (m > 2)) 
     { 
      if (i < (m - 1)) 
       return i; 
      else 
       return m - 2; 
     } 
     else 
      return m - 1; 
    } 

    public void PERM(int m) 
    { 
     int[] I = new int[m + 1]; 

     for (int i = 1; i <= m; i++) 
      I[i] = 1; 
     int Mi = 1; 

     while (count < silnia(m)) 
     { 
      if (I[Mi] == Mi) 
      { 
       if (I[Mi] == 1 && Mi == 1) 
       { 
        count++; 
        Console.Write("{0}:\t", count); 
        for (int i = 1; i <= n; i++) 
         Console.Write("{0} ", P[i]); 
        Console.WriteLine(); 
       } 
       for (int i = 1; i <= Mi; i++) 
        I[i] = 1; 
       Mi++; 
      } 
      if (I[Mi] < Mi) 
      { 
       int i = I[Mi]; 
       swap(ref P[B(Mi, i)], ref P[Mi]); 
       I[Mi]++; 
       Mi = 1; 
      } 
     } 
    } 

    public void getData() 
    { 
     Console.WriteLine("Podaj ilość elementów: "); 
     n = Int32.Parse(Console.ReadLine()); 
     P = new int[n + 1]; 
     for (int i = 1; i <= n; i++) 
      P[i] = i; 
     count = 0; 
     PERM(n); 
    } 

    static void Main(string[] args) 
    { 
     Program prog = new Program(); 
     prog.getData(); 
     Console.ReadKey(); 
    } 
} 
関連する問題