Foreach.cz aneb pokus o nemožné - - - Jan Chlad

Algoritmus - Rozklad čísla na číslice, součet a počet cifer

Posledních 14 dní jsem byl poněkud zaměstnán školou a nebyl vůbec čas vyplodit sem nějakou tu myšlenku. Rád bych to nyní alespoň nepatrno napravil řešením relativně jednoduché, leč zajímavé úlohy rozkladu čísla na jednotlivé číslice s jejich následným součtem, určením počtu cifer a zobrazením.

Všechny zmíněné operace lze provést například pomocí těchto statických metod:

  • int pocetCiferCisla(int cislo) - vrací počet cifer čísla
  • int[] rozkladCislaNaCislice(int rozkladoveCislo, int pocetCifer) - vrací pole číslic z rozloženého čísla
  • int soucetCislic(int[] poleCislic) - vrací součet číslic pole
  • string zobrazCislice(int[] poleCislic) - vrací řetězec vypsaných číslic z pole

Zdrojové kódy jednotlivých metod hned následují:

int pocetCiferCisla(int cislo)

//Metoda pocetCiferCisla vraci počet cifer čísla uvedeného v parametru
public static int pocetCiferCisla(int cislo)
{
  int cifry = 0;
  //Dělí číslo 10 dokud není 0 a přičítá počet cifer za každé dělení
  while (cislo > 0)
  {
     cislo /= 10;
     cifry++;
   }
  return cifry;
}

int[] rozkladCislaNaCislice(int rozkladoveCislo, int pocetCifer)

//Metoda rozkladCislaNaCislice vrací pole jednotlivých číslic po rozkladu čísla v parametru
//int rozkladoveCislo je číslo k rozkladu a pocetCifer se udává z důvodu velikosti pole
public static int[] rozkladCislaNaCislice(int rozkladoveCislo, int pocetCifer)
{
  int cislice = 0;
  int[] poleCislic = new int[pocetCifer];
  //Dokud není rozkladové číslo 0 je jeho zbytek po dělení 10 (%) ukládán jako cislice do poleCislic
  for (int i = 0; rozkladoveCislo != 0; i++)
  {
    cislice = rozkladoveCislo % 10;
    rozkladoveCislo /= 10;
    poleCislic[i] = cislice;
   }

//Číslice se do pole vkládají od konce je tedy dobré jej nakonci otočit metodou Array.Reverse()
Array.Reverse(poleCislic);
   return poleCislic;
}

int soucetCislic(int[] poleCislic)

//Metoda soucetCislic vrací součet pole číslic
 public static int soucetCislic(int[] poleCislic)
  {
     int soucet = 0;
     
    //Prochází pole a přičítá jednotlivé číslice
    for (int i = 0; i < poleCislic.Length; i++)
    {
       soucet += poleCislic[i];
    }
     return soucet;
}

string zobrazCislice(int[] poleCislic)

 //Metoda přidává jednotlivé prvky pole do StringBuilderu a nakonec jej vrací
  public static string zobrazCislice(int[] poleCislic)
  {
   StringBuilder sb = new StringBuilder();

    for (int i = 0; i < poleCislic.Length; i++)
    {
       sb.Append(string.Format("{0}, ", poleCislic[i]));
    }

       return sb.ToString();
   }

void Proved(object sender, EventArgs e)

//Použití metod na windowsovém formuláři
//rozkladoveCislo_TxtBox.Text = TextBox
//soucet_TxtBox.Text = TextBox
//cislice_TxtBox.Text = TextBox

private void Proved(object sender, EventArgs e)
{
   //uloží číslo z textboxu
   int rozkladoveCislo = int.Parse(rozkladoveCislo_TxtBox.Text);
   //určí počet cifer z čísla pro definování velikosti pole
   int pocetCifer = pocetCiferCisla(rozkladoveCislo);
   //do poleCislic uloží rozložené číslice z čísla
   int[] poleCislic = rozkladCislaNaCislice(rozkladoveCislo, pocetCifer);
   //vypíše do textboxu součet číslic z poleCislic
   soucet_TxtBox.Text = soucetCislic(poleCislic).ToString();
   //zobrazí jednotlivé číslice
   cislice_TxtBox.Text = zobrazCislice(poleCislic);
}

Rozklad na číslice

Doufám, že jsem popsal výše uvedené metody v komentářích dostatečně. Prakticky jde jen o užitečnou ukázku cyklu for, místo obvyklého demo příkladu výpisu 'i' čísel. Samozřejmě výše uvedené ukázky nemusí a určitě nejsou jediným způsobem jak problém rozkladu čísla na číslice řešit. Pokud máte nějaké návrhy či připomínky rád si jej přečtu v komentářích či v mailu.

Doplněno po necelém roce dne 15.9.2009 - nebo to také celé jde dělat takto pomocí ArrayList(jak už to tak bývá, člověk se pořád zdokonaluje :)):

            Console.Write("Zadejte cislo: ");
            string vstup = Console.ReadLine();
            int soucet = 0;
            ArrayList list = new ArrayList();

            foreach(char znak in vstup)
            {
                soucet += int.Parse(znak.ToString());
                list.Add(znak);
            }

            Console.WriteLine("soucet: " + soucet.ToString());
            Console.ReadLine();

Kategorie: Algoritmy | Vydáno dne: 20.10.2008 1:27 | Zobrazeno: 6780x | Komentováno: 5x


Komentáře

Kolonka Web je volitelná. HTML značky v komentáři budou převedeny na prostý text. Text ve tvaru http://^ | www.^ bude převeden na odkaz. Odpovídejte Ano / Ne.

Jméno:  
Web:

 
Odpovězte na otázku: Je patnáct více než dvacettři?      

Honza - 14.9.2009 23:54

Koochy - 29.7.2009 18:44

Rider - 7.12.2008 23:16

Čad - 22.10.2008 12:28

Nidzo - 22.10.2008 12:05