Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///////////////////////
- //tu mas .exe
- //http://leteckaposta.cz/564010027
- ///////////////////////
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace DlouhyCisla
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("==============================================\n Soucet a soucin fakt velkych cisel \n==============================================\n");
- List<int> prvniCislo = VytvorZeVstupu(),
- druheCislo = VytvorZeVstupu(),
- soucet,
- soucin;
- //prvni je to kratsi
- soucet = (prvniCislo.Count < druheCislo.Count) ? SoucetVelkychCisel(prvniCislo, druheCislo)
- : SoucetVelkychCisel(druheCislo, prvniCislo);
- soucin = (prvniCislo.Count > druheCislo.Count) ? SoucinVelkychCisel(prvniCislo, druheCislo)
- : SoucinVelkychCisel(druheCislo, prvniCislo);
- Console.ForegroundColor = ConsoleColor.Green;
- Console.Write("Soucet je: ");
- Tisk(soucet);
- Console.ForegroundColor = ConsoleColor.Red;
- Console.Write("\nSoucin je: ");
- Tisk(soucin);
- Console.ReadKey();
- }
- static List<int> SoucetVelkychCisel(List<int> prvniList, List<int> druhyList)
- {
- List<int> vysledek = new List<int>();
- int soucet = 0, prebytek = 0, j = 0,
- rozdilDelek = druhyList.Count - prvniList.Count;
- //Srovnani delek cisel, predpokladame ze 1. cislo je vzdy delsi
- for (int i = 0; i < rozdilDelek; i++) //na zacatek kratsiho cisla pridam nuly tak,
- prvniList.Insert(0, 0); //aby byla stejne dlouha. ze jo, 0 + neco = neco, a pak scitam
- //Scitani
- for (int i = prvniList.Count - 1; i >= 0; i--)
- {
- soucet = (prvniList[i] + druhyList[i] + prebytek) % 10; //cislice kterou zapisu
- prebytek = (prvniList[i] + druhyList[i] + prebytek) / 10; //prebytek 10
- vysledek.Insert(0, soucet); //vlozim na ZACATEK
- }
- //posledni cislice
- if (prebytek > 0) //pokud i po tomto souctu neco zbyde, pridam to na uplny zacatek
- vysledek.Insert(0, prebytek);
- //smazu pridane nuly
- while (prvniList[j] == 0)
- prvniList.RemoveAt(j);
- return vysledek;
- }
- //predpokladame ze prvni je delsi
- static List<int> SoucinVelkychCisel(List<int> prvni, List<int> druhe)
- {
- List<int> vysledekJednoho = new List<int>();
- List<List<int>> mezivysledky = new List<List<int>>();
- int prebytek = 0, rozdil = druhe.Count - prvni.Count;
- //Budu nasobit ciframi v druhem cisle, pujdu zprava doleva
- for (int i = druhe.Count - 1; i >= 0 ; i--)
- {
- //1 cislici v druhem cisle nasobim vsechny cislice 1. cisla
- for (int j = prvni.Count - 1; j >= 0; j--)
- {
- //za zacatek cisla (vlevo) pridam druhou cislici toho, co vznikne po vynasobeni cifer obou cisel
- vysledekJednoho.Insert(0, ((prvni[j] * druhe[i]) + prebytek) % 10);
- //z te prvni cislice vypocitam zbytek
- prebytek = ((prvni[j] * druhe[i]) + prebytek) / 10;
- }
- //Tady prictu pripadny prebytek po vynasobeni vsećh cifer tim 1 cislem
- if (prebytek > 0)
- vysledekJednoho.Insert(0, prebytek);
- //posunuti vsech cislic, posunu o pocet_hotovych_nasobeni - 1. Posunuju se kvuli souctum, a to tak, ze na konec pridam nuly.
- for (int k = druhe.Count - 1; k > i; k--)
- vysledekJednoho.Add(0);
- //ulozim si posunuty vysledek toho soucinu (1 cislice s celym druhym cislem) do mezivysledku
- mezivysledky.Add(vysledekJednoho);
- //zacnu znova o cifru dal v druhem cisle
- vysledekJednoho = new List<int>();
- ////nezapomen vynulovat prebytek ! ! !
- prebytek = 0;
- }
- //postupne scitam vsechny mezivysledky
- vysledekJednoho = mezivysledky[0];
- for (int i = 1; i < mezivysledky.Count; i++)
- {
- vysledekJednoho = SoucetVelkychCisel(vysledekJednoho, mezivysledky[i]);
- }
- return vysledekJednoho;
- }
- static List<int> VytvorZeVstupu()
- {
- Console.Write("Zadej cele cislo: ");
- string vstup = Console.ReadLine();
- List<int> cislo = new List<int>();
- for (int i = 0; i < vstup.Length; i++)
- {
- //Pokud se neco nepodari prevest, vratim prazdny list, tim padem se nic nespocita
- if (!int.TryParse(vstup[i].ToString(), out int prevedene))
- return new List<int>();
- cislo.Add(prevedene);
- }
- return cislo;
- }
- static void Tisk(List<int> sez)
- {
- foreach (int i in sez)
- Console.Write(i);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment