25 / 32
Oct 2021

Zasadniczo nie można tu mówić o 'zniszczeniu tablicy', bo wskaźnik w ostatnim kroku wychodził poza tablicę. Niszczyłeś więc coś co znajdowało się zaraz za tablicą i dlatego SPOJ reagował errorem SIGABRT. Dlaczego w CodeBlocksie nie było błędu? To już trzeba się zagłębić w teorię jak operatory new[] i delete[] realizują funkcję alokowania i zwalniania pamięci. Moja hipoteza jest taka, że operator new[] nie zawsze alokuje dokładnie takiej ilości pamięci jaka jest żądana, ale czasami zaokrągla tą ilość w górę - tak by ilość była wielokrotnością konkretnej stałej ilości pamięci. Być może testując na C::B miałeś do czynienia z tą powiększoną tablicą. Potestuj u siebie z takimi testami, by tablica osiągała coraz większe rozmiary, a być może trafisz na test gdzie też się wysypie z errorem SIGABRT.

Hey, jestem właśnie w trakcie rozwiązywania tego zadania i po prostu się poddaję. Próbowałem iteracją, próbowałem rekurencją i nadal sędzia mówi, że przekroczyłem limit czasu. Możecie coś doradzić? Oto kody:

Rekurencja (zdania w cudzysłowie wywaliłem rzecz jasna):

Summary

include

include

using namespace std;

long long int silnia_f (long long int n)
{
if (n <= 1) return 1;
else return n*silnia_f(n-1);
}

int main()
{

long long int n,silnia, dziesiatki, jednosci;

cout<<"Podaj ilosc liczb do sprawdzenia: ";
cin>>n;

if(n<0)
{
cerr<<"Podales liczbe ujemna!";
exit(0);
}
else if(n>30)
{
cerr<<"Podales za duzo ilosc liczb do sprawdzenia!";
exit (0);
}

int tab[n];

for(int i=0; i<n; i++)
{
cout<<"Podaj liczbe: ";
cin>>tab[i];
}

for(int i=0; i<n; i++)
{

 silnia=silnia_f(tab[i]);

 dziesiatki=(silnia/10)%10;
 jednosci=silnia%10;

  cout<<dziesiatki<<" ";
  cout<<jednosci<<endl;

}

delete [] tab;

return 0;

}

Iteracja:

Summary

include

using namespace std;

int main()
{
long long int, n,silnia, m, dziesiatki, jednosci;

cout<<"Podaj ilosc liczb do sprawdzenia: ";
cin>>n; // ile liczb

int tab[n];

for(int i=0; i<n; i++)
{
cout<<"Podaj liczbe: ";
cin>>tab[i];
}

for(int i=0; i<n; i++)
{
silnia=tab[i];
m=tab[i];

 for(int j=1; j<m; j++)
 {
     tab[i]--;
     silnia=silnia*tab[i];
 }

 dziesiatki=(silnia/10)%10;
 jednosci=silnia%10;

  cout<<dziesiatki<<" ";
  cout<<jednosci<<endl;

}

return 0;

}

wersja rekurencyjna jest blizsza rozwizania. Nie potrzebnie próbujesz liczyć całą silnię skoro potrzebujesz tylko 2 ostatnie cyfry. Jeśli jeszcze usuniesz te dodatki z outputu poprawisz powinno być AC.

PS Nie potrzebnie tablicujesz wyniki. Możesz po prostu pobrać 1 liczbę, policzyć, wypisać wynik i pobrać kolejną

PS 2 dane na wejściu są zawsze zgodne z specyfikacją podaną w zadaniu

PS 3 kod najlepiej linkuj do ideone.com wtedy nie jest pocięty i można go łątwo przetestować.

Teraz kod wygląda tak: http://ideone.com/Cpk17131

Nadal mam błąd. O co tutaj chodzi? Jak inaczej mam wyznaczyć te dwie ostatnie cyfry bez wykonywania kalkulacji i policzenia silni? Czego ten program oczekuje, żeby limit czasu się zgadzał? Nie mam pojęcia co mam jeszcze wywalić.

Znowu ukróciłem, tym razem do granic możliwości, też nie akceptuje: http://ideone.com/riZCej41

druga wersja jest lepsza ale dalej niepotrzebnie liczysz całą silnię. Weź kalkulator i policz sobie silnie z liczb od 1 do 15. wtedy będziesz wiedzieć jak zrobić to zadanie

Czy chodzi Ci o to, że dla każdej liczby powyżej 9 jedności i dziesiątki silni to zawsze 0 i 0? No bo nie rozumiem jak można wyznaczyć dziesiątki i jedności jakiejś liczby bez liczenia jej. Czy o to chodzi, czy co coś innego?

4 months later

Cześć, próbowałem już ze 100 razy i ciągle czegoś nie rozumiem/ nie umiem zrobić - wyskakuje mi błędna odpowiedź. Czy ktoś może mi powiedzieć, o co chodzi?

#include < iostream >
using namespace std;

int main(){
unsigned int d;

cin>>d;
unsigned long int liczby[d];
unsigned long int silnie[d];
long double k;

for(int i=0;i<d;i++){
	cin>>liczby[i];
}

for(int i=0;i<d;i++){
	if (liczby[i]<=1){
		cout<<0<<" "<<1<<endl;
	}
	else if (liczby[i]<=9){
		silnie[i]=1;
		while(liczby[i]>1){
			silnie[i]=silnie[i]*liczby[i];
			liczby[i]--;
		}
		k = silnie[i];
		k/=100;
		k-=int(k);
		cout<<int(k*10)<<" "<<int(k*100-int(k*10)*10)<<endl;
		}
	else if (liczby[i]>9){
		cout<<0<<" "<<0<<endl;
	}
}
return 0;

}

a czy potrafisz przetestować swój program dla 10 wartości, czy też może jest to dla ciebie za trudne ?

4 years later

Witam, mam problem z uruchomieniem programu, pojawia się błąd: przekroczono limit czasu… Nie wiem co zrobiłem źle. Proszę bardziej doświadczonych kolegów o radę.
KOD:

#include

using namespace std;

int n, D, silnia=1;

int main()
{
cin >> D;
for(int i=1; i<=D; i++)
{
cin >> n;
if(n<=1)
{
silnia = 1;
cout << silnia/10 << " " << silnia%10;
}
else if(n>=2 && n<=1000000000)
{
for(int i=1; i<=n; i++)
{
silnia *= i;
}
cout << silnia/10 << " " << silnia%10 << endl;
}
}
return 0;
}

image
Kompiluje się w 0 sekund i zwraca poprawne wyniki, więc o co może chodzić???

A dla
2
1000000000
999999999

zamiast 2, może tam być D = 30

Witam, kod wyglada nastepująco :

//*** FCTRL3 - Dwie cyfry silni ***\

#include
#include <windows.h>

using namespace std;

int n, D, maks, silnia=1;

int main()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),14);
cout << “*** FCTRL3 - Dwie cyfry silni ***” << endl << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
cout << "Podaj liczbe przypadkow: ";
cin >> D;

if(D>=1 && D<=30)
{
    for(int i=1; i<=D; i++)
    {
    cout << endl << "Podaj liczbe n! " << i << " przypadku: ";
    cin >> n;
    if(n<=1)
    {
        silnia = 1;
        cout << "Silnia n! wynosi: " << silnia/10 << " " << silnia%10 << endl;
    }
    else if(n>=2 && n<=1000000000)
    {
        cout << "Silnia " << n << "! wynosi: ";
        for(int i=1; i<=n; i++)
        {
            silnia *= i;
        }
        if(silnia>9)
        {
            cout << silnia/10 << " " << silnia%10 << endl;
        }
        else
        {
            cout << silnia/10 << " " << silnia%10 << endl;
        }
    }
    }
}
else if(D<=0)
{
    cout << endl << "Liczba musi byc dodatnia!";
}
return 0;

}
Niestety nie przyjmuje Sędzia

  1. windows.h nie jest obslugiwane.
  2. sedzia jest bezdusznym programem, ktory przyjmuje tylko okreslony w zadaniu format danych.
    teksty typu

sa uwazane za bledna odpowiedz.
3. czy zmienna

jest w stanie przechowac wynik obliczen?

  1. pkt 2 i 3 byly opisywane na forum w watkach dotyczacych tego zadania. szybciej jest troszke poszukac i poczytac niz czekac na odppwiedz, ktora moze nie przyjsc z powodu nieczytelnego wklejenia kodu.

Nie chciałbym psuć zabawy, ale w tym zadaniu trzeba zmienić podejście do zadania, bo double też nie wystarczy.

a nie próbowałeś przeczytać ten wątek, cały, ze zrozumieniem ? Wskazówka występuje kilka razy…