Sčítání číslic   zodpovězená otázka

C#

Ahoj.

Už dost dlouho řeším problém, a nemůžu tomu přijít na kloub.

Mám nějaké číslo: 572, a potřebuju ty čísla mezi sebou sčítat, dokud mi nezbyde jen ječno číslo.

Přesněji: 572 = 5 + 7 + 2 = 14 = 1 + 4 = 5

Zkoušel jsem while, for, foreach, kombinovaně, ale prostě mi to nejde. Dělám to v ConsoleApplication a to číslo se vůbec nevipíše.

Console.WriteLine(SectiCislice(572).ToString());

Poradíte mi prosím?

Díky

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Lze to řešit pomocí rekurze, kdy uděláte funkci na sečtení cifer a ta sama sebe volá dokud je výsledek větší než 9:

private int SectiCislice(int cislo)
{
  var cislicePole = cislo.ToString().ToArray();
  int vysledek = 0;

  foreach (var cislice in cislicePole)
  {
    vysledek += int.Parse(cislice.ToString());
  }

  if (vysledek > 9)
  {
    return SectiCislice(vysledek);
  }
  else
  {
    return vysledek;
  }
}

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky moc

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

<hnidopišská>

Btw to ToArray je v prvním řádku v metodě zbytečné, string sám o sobě implementuje IEnumerable<char>, takže na něj můžete zavolat foreach. A kdybyste nebyl v .NET 4, tak se dá využít klasický for cyklus.

ToArray celý string okopíruje, což je zbytečná operace

</hnidopišská>

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Včera za mnou přišel bratr s tím, že podobný příklad měli v zápočtovce a nevěděl si s tím rady.

V zadání bylo omezení, že mohou používat pouze matematické operace a funkci MOD. Nemohli využít pole ani nic podobného. Vstupem mohlo být libovolně dlouhé reálné číslo a měli udělat aritmetický součet (takže aby to odpovídalo zadání v tomto topicu kdy uživatel potřebuje provádět aritmetický součet dokud nedostane číslo mezi 0 a 9, přidal jsem pouze rekurzivní volání fuknce). Navíc v mém řešení se pracuje jen s číslama a ne se stringem, takže kdyby to číslo bylo jó dlouhý, mohlo by to být znát i na výkonu.

Vymyslel jsem toto:

Visual Basic:

    Function SectiCisla(ByVal vstup As Integer) As Integer

        Dim vystup As Integer


        While vstup <> 0
            vystup = vystup + (vstup Mod 10)
            vstup = vstup \ 10
        End While


        If vystup > 9 Then Return SectiCisla(vystup)
        Return vystup

    End Function

C#

public int SectiCisla(int vstup)
{

	int vystup = 0;


	while (vstup != 0) 
        {
		vystup = vystup + (vstup % 10);
		vstup = vstup / 10;
	}


	if (vystup > 9)	return SectiCisla(vystup);
	return vystup;

}

Vzhledem k tomu že C# moc neovládám, použil jsem konvertor, tak doufám že syntaxe je ok.

Asi si najdu víc podobných příkladů, je docela dobrý si takhle procvičit mozek. Kolikrát člověk z lenosti vymýšlí šílený konstrukce a přitom to často jde i celkem jednoduše :)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback