• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Porównanie liczb o dużej ilości cyfr.

Object Storage Arubacloud
+1 głos
313 wizyt
pytanie zadane 16 grudnia 2018 w C i C++ przez kamyk2 Początkujący (420 p.)

Witam, mam zadanie, z którym są u mnie pewne trudności. Program ma wypisywać liczbę większą z dwóch podanych w systemie dziesiętnym i oddzielonych spacją. Nie byłoby w tym nic trudnego, gdyby nie to, że podawane liczby mogą mieć co najwyżej milion cyfr. Próbowałem rozwiązań z tablicami, coś w stylu rozpatrywania na przypadki, tzn. dwie tablice charów, jeżeli taka sama ilość znaków to przesuwanie wskaźników od pierwszej cyfry obydwu tablic i porównywanie ich, jeżeli jedna jest większa od drugiej to liczba w całości większa. Przed tym oczywiście zliczać liczby cyfr (znaków) w tablicach i rozstrzyganie, że ta z większą ilością cyfr(znaków) jest większa. Nie wiem czy takie podejście jest odpowiednie, to na pewno da się zrobić jakoś prościej i w sumie efektywniej.

Dziękuję, pozdrawiam.

2 odpowiedzi

+1 głos
odpowiedź 16 grudnia 2018 przez NIMuser Stary wyjadacz (11,030 p.)
Nie jest to trudne, w praktyce sprowadza się do sprawdzenia n pierwszych cyfr liczb (w obu tablicach) o takiej samej długości oczywiście. Nie widzę nic trudnego. Problem mógłby być jakbyś miał je pomnożyć czy podzielić ;) Przy mnożeniu używa się zwykle algorytmu Karacuby.

Jak masz dwie liczby (o tej samej liczbie cyfr!):

3456845345...............................................

3456476545...............................................

to od razu widać ze pierwsza jest większa :)  Przechodzisz przez tablicę do momentu kiedy napotkasz rożne cyfry i sprawdzasz która z nich jest większa i tyle. Przypadek kiedy liczby mają różna liczbę cyfr jest jeszcze bardziej trywialny.
komentarz 16 grudnia 2018 przez kamyk2 Początkujący (420 p.)
#include "pch.h"
#include <iostream>
using namespace std;


int dlugosc(char const * s1)
{
	int licznik = 0;
	while (*s1)
	{
		licznik++;
			s1++;
	} return licznik;
}

bool wieksza(char const * s1, char const * s2)
{
	char const *s = s1;
	char const *p = s2;
	while (*s)
	{
		if (*p == '\0') return true;
		s++;
		p++;
	}  return false;


}

bool wieksza1(char const * s1, char const * s2)
{
	char const *s = s1;
	char const *p = s2;
	while (*s)
	{
		if (*s > *p) return true;
		s++;
		p++;
	} return false;


}

int main()
{
	char * s1 = new char [1000000];
	char * s2 = new char [1000000];
	cin >> s1;
	cin >> s2;;
	if (dlugosc(s1) != dlugosc(s2))
	{
		if (wieksza(s1, s2) == 1) cout << "PIERWSZA >"; else cout << "DRUGA >";
	} else  if (wieksza1(s1, s2) == 1) cout << "PIERWSZA >"; else cout << "DRUGA >";


Zastosowałem się do porady, jak to ocenicie? Wiem, że mało optymalnie, ale działa..

0 głosów
odpowiedź 16 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
W tym zadaniu nic nie liczysz. Zakładając że obie liczby są dodatnie (nie ma problemu znaku), porównujesz najpierw długość napisów. W sposób oczywisty ten dłuższy będzie liczbą większą (zakładam że jest poprawną liczbą zapisaną w string'u).

Jedyny problem występuje w przypadku liczb o takiej samej długości string'a. Wtedy stosujesz compare które rozstrzyga czy liczby są równe, mniejsze czy większe: https://en.cppreference.com/w/cpp/string/basic_string/compare

Na marginesie.. lepiej taguj zapytania. Masz tam C a przykłady w C++. Zakładałem że chodzi o C++. Jeśli nie to strcmp(), załatwia także problem: https://en.cppreference.com/w/c/string/byte/strcmp
komentarz 17 grudnia 2018 przez kamyk2 Początkujący (420 p.)
Dodatkowo w poleceniu na sprawdzianie było, że nie mogę użyć ww.  A podpowiedź odnośnie tagów wdrożę w życie.
komentarz 17 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
No tak. To może przejedź na stronach które podałem do sekcji "Possible implementation". Będziesz miał rozwiązanie swojego problemu. A jeśli nie to "strcmp possible implementation" w google załatwia sprawę.

Podobne pytania

0 głosów
2 odpowiedzi 657 wizyt
pytanie zadane 12 maja 2017 w JavaScript przez Robert de Clair Mądrala (5,300 p.)
0 głosów
2 odpowiedzi 449 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez Hitorne Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 950 wizyt

92,568 zapytań

141,422 odpowiedzi

319,641 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...