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
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;
}
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;
}
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
- windows.h nie jest obslugiwane.
- 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?
- 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.
Suggested Topics
Topic | Category | Replies | Views | Activity |
---|---|---|---|---|
TFRACAL - Kalkulator ułamków | Zbiór zadań | 2 | 192 | Feb 1 |
FR_20_02 - Poszukiwacze skarbów - Błąd w testach? | Zbiór zadań | 1 | 154 | Apr 2 |
SPOJ.com - Problem ZABAWA pl.spoj.com | Zbiór zadań | 6 | 136 | Jun 23 |