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

SPOJ - C zadanie średnie

VPS Starter Arubacloud
0 głosów
236 wizyt
pytanie zadane 24 października 2022 w C i C++ przez Quba Użytkownik (870 p.)

Witam wszystkich chciałbym spytać czy ma ktoś pomysł na rozwiązanie poniższej kwestii, gdyż ewidentnie nie jestem w stanie od dłuższego czasu znaleźć źródła problemu.

 

Chciałem rozwiązać na SPOJ-u zadanie średnie o nazwie Not So Fast Multiplication.

link do zadania: LINK

Zadanie rozwiązałem w języku C i sprawdziłem czy dla inputów z przykładu jak i dla moich własnych wymyślonych inputów program działa. I działa poprawnie. Jednak kiedy chcę sprawdzić czy sędzia na SPOJ-u przepuści zadanie to po kliknięciu "Submit soluction" na dole strony, a następnie wczytaniu mojego kodu i wybraniu "C gcc 8.3" klikam przycisk "zgłaszam". Ostatecznie dostaję informację od sędziego na SPOJ-u o treści "Błędna odpowiedź".

 

Mój kod:

#include <stdio.h>
int main()
{
	int i,n,wynik,a,b;
	
	scanf("%d",&n);
	int arr[n];
	
	for(i=0;i<n;i++)
	{
		scanf("%d%d", &a,&b);
		wynik=a*b;
		arr[i]=wynik;	
	}	
	
	for(i=0;i<n;i++)
	{
		printf("%d\n",arr[i]);
	}

	return 0;
}

Jeśli ktoś wie gdzie tkwi problem będę niezwykle wdzięczny. Dziękuję za wszelką pomoc.

Pozdrawiam

Kuba

komentarz 24 października 2022 przez Whistleroosh Maniak (56,900 p.)

Sprawdź program dla danych:

1
1000000 1000000

 

komentarz 24 października 2022 przez Quba Użytkownik (870 p.)

Zdawało mi się, że to znaczy, że powinienem był zmienić typ zmiennych na większy przy zmiennych wynik, a oraz b. Wtedy faktycznie wychodzi poprawny wynik jednak nadal na SPOJU widnieje "błędna odpowiedź" frown

 

komentarz 24 października 2022 przez Whistleroosh Maniak (56,900 p.)

To spróbuj teraz dla:

1
10000000000 10000000000
komentarz 24 października 2022 przez Quba Użytkownik (870 p.)
Faktycznie teraz zawsze wynik jest błędny. Próbuję używać unsigned long long inta jednak to nie pomaga i niestety na tym chyba moja wiedza się kończy w tym momencie. Nie jestem pewien jak zaradzić temu problemowi.
2
komentarz 24 października 2022 przez Whistleroosh Maniak (56,900 p.)
Żaden typ nie pomieści tak dużej liczby. W tym zadaniu chodzi o to, żeby samemu zaimplementować własne mnożenie na stringach.
1
komentarz 24 października 2022 przez Great Stary wyjadacz (12,300 p.)

@Quba, z obecnym poziomem wiedzy nie rozwiążesz żadnego zadania z kategorii średnich SPOJa. Zacznij od prostszych zadań i testuj swoje rozwiązania względem skrajnych przypadków.

komentarz 24 października 2022 przez Quba Użytkownik (870 p.)

@Whistleroosh, W porządku, dziękuję za pomoc w nakierowaniu, spróbuję zrozumieć temat.smiley

 

1 odpowiedź

0 głosów
odpowiedź 11 listopada 2022 przez polandonion Mądrala (6,970 p.)
wybrane 21 listopada 2022 przez Quba
 
Najlepsza
#include <iostream>
#include <string>

using namespace std;

string dodaj(string a, string b) {
	string wy = "";
	while (a.size() != b.size()) {
		if (a.size() > b.size())
			b = '0' + b;
		else a = '0' + a;
	}
	int p = 0;
	for (int i = a.size() - 1; i >= 0; i --) {
		wy = (char)((a[i] + b[i] - 2 * '0' + p) % 10 + '0') + wy;
		p = (int)((a[i] + b[i] - 2 * '0' + p) / 10);
	}
	if (p != 0) wy = (char)(p + '0') + wy;
	return wy;
}

void pomnoz(string a, string b) {
	int p, d = 0;
	while (a.back() == '0' and a.size() > 2) {a.pop_back(); d ++;}
	while (b.back() == '0' and b.size() > 2) {b.pop_back(); d ++;}
	string wy = "", tmp;
	for (int i = b.size() - 1; i >= 0; i --) {
		tmp = ""; p = 0;
		for (int j = a.size() - 1; j >= 0; j --) {
			tmp = (char)(((a[j] - '0') * (b[i] - '0') + p) % 10 + '0') + tmp;
			p = (int)(((a[j] - '0') * (b[i] - '0') + p) / 10);
		}
		if (p != 0) tmp = (char)(p + '0') + tmp;
		for (int j = i + 1; j < b.size(); j ++)
			tmp = tmp + '0';
		wy = dodaj(wy, tmp);
	}
	for (int i = 0; i < d; i ++) wy = wy + '0';
	p = 0;
	while (wy[p] == '0' and wy.size() > 1) p ++;
	for (int i = p; i < wy.size(); i ++)
		cout << wy[i];
}

int main() {
	string a, b;
	cin >> a >> b;
	pomnoz(a, b);
}

Kod do mnożenia dwóch ogromnych liczb

komentarz 11 listopada 2022 przez polandonion Mądrala (6,970 p.)
Oczywiście odpowiedź podana w C++. W C zamiast string użyj tablicy char' ów. No i oczywiście nie zapomnij o przebudowie main' a tak aby wczytywał n liczb (a nie zawsze 2).

Podobne pytania

0 głosów
0 odpowiedzi 84 wizyt
pytanie zadane 10 lipca 2019 w C i C++ przez Padomen Początkujący (260 p.)
0 głosów
1 odpowiedź 232 wizyt
pytanie zadane 16 czerwca 2021 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 245 wizyt
pytanie zadane 12 marca 2023 w SPOJ przez skyynet Początkujący (410 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...