Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 13. 12. 2010 00:29

myrek
Příspěvky: 223
Reputace:   
 

permutace pascal

Dobrý den,
chtěl bych se zeptat zda se nějak dá využít program urcujici nasledujici permutaci k vytvoreni programu "n-tá permutace" - na vstupu by byly dvě čísla (jedno znamenajici pocet prvku permutace a druhe poradi permutace v lexikografickém uspořádání).
děkuji

Offline

  • (téma jako vyřešené označil(a) myrek)

#2 14. 12. 2010 19:44

Billy
Příspěvky: 60
Reputace:   
 

Re: permutace pascal

↑ myrek:
Zdarec,

no to zavisi od toho jak generujes tu dalsiu permutaci, ale ked chces len k- tu permutaciu v lexikografickom poradi, tak ono sa to da vycitat priamo s toho cisla. Rekurzivne si pocitas cifry na zaklade toho cisla. Mal som to na pisomke este v prvaku, tak prikladam kod v C#.

PS: Rekurzivne sa to da urobit ovela elegantnejsie.

Code:

using System;
using System.Collections.Generic;

namespace permutace

{

    class Program

    {

        static int[] Prvky = new int[100];

         
      
        static int N;       // pocet prvkov        
        static int K;      // K-ta permutace

        static int[] Permutacie = new int[100];



        static int Faktorial(int N)

        {

            int i = 1;



            for (int j = 1; j <= N; j++)

                i = i * j;

            return i;



        }



        static void Vymaz(int[] Pole, int M)

        {



            for (int i = 1; i <= N; i++)

                if (Pole[i] == M)

                {

                    for (int j = i; j <= N; j++)

                        Pole[j] = Pole[j + 1];

                    break;

                }

        }





        static void Main(string[] args)

        {

            string vstup;

            string[] VstupPom = new string[2];



            vstup = Console.ReadLine();

            VstupPom = vstup.Split();



            N = int.Parse(VstupPom[0]);

            K = int.Parse(VstupPom[1]);

            int Vystup;



            for (int i = 1; i <= N; i++)

                Prvky[i] = i;





            for (int i = 1; i <= N; i++)

            {

                if (K % Faktorial(N - i) == 0)

                {

                    Vystup = Prvky[K / Faktorial(N - i)];

                    Console.Write(Prvky[K / Faktorial(N - i)] %2 + " ");

                    Vymaz(Prvky, Vystup);

                    K = K - (K / Faktorial(N - i) - 1) * (Faktorial(N - i));

                }

                else

                {

                    Vystup = Prvky[((K + Faktorial(N - i)) / Faktorial(N - i))];

                    Console.Write(Vystup%2 + " ");

                    Vymaz(Prvky, Vystup);

                    K = K - (((K + Faktorial(N - i)) / Faktorial(N - i)) - 1) * (Faktorial(N - i));

                }

            }





        

        }

    }

}

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson