1 / 16
Mar 2017

Witam!
Zabierałem się za zadanie "niekolejne" ale napotkałem dziwny problem już na samym starcie.
dla dowolnego int a i string b; pętla

for (int i=0;i<a;i++)
{b[i]=i;}

działa tak, że gdy wypisuję b wyskakuje mi 0x28fe80
Dla pętli

cin >> a;
c=a;
for (int i=a;i>0;i--)
{b[i-1]=a;
c=c-1;}
cout << b;

nie mam wcale wyniku :confused:

Czy rozmiar łańcucha b wynosi co najmniej a?

Generalnie, dużo łatwiej będzie coś powiedzieć jeśli wkleisz cały program demonstrujący problem.

Nie napisałem dużo więcej w programie
I nie zadeklarowałem długości stringa wcale

EDIT
Dla string b[a](dla drugiego kodu) program oddaje 0x28fe70

'b' to nazwa tablicy 'b[]', a nazwa tablicy jest jednocześnie adresem jej początku więc wypisuje Ci ten adres tablicy. Jedynie początek adresu tablicy char jest interpretowany jako początek stringa i wtedy otrzymujemy wypis tego stringa. Zadeklaruj tablicę 'b' jako tablicę charów.

int a, c;
cin >> a;
char b[a];
for (int i=0;i<a;i++)
b[i]=(char)i;
cout << b;
return 0;

Dla a=4 nie zwraca nic

int a, c;
cin >> a;
char b[a];
c=a;
for (int i=a;i>0;i--)
{b[i-1]=(char)c;
c=c-1;}
cout << b;
return 0;

Dla a=4 oddaje -buźka, buźka, serduszko, karo, ś, !!, @

Tak się nie zamienia inta na c_stringa. Musisz to robić cyfra po cyfrze.

Nie. Ale chyba nie o to Ci chodzi. Jeśli chcesz wypisywać tablicę np. intów czy tablicę stringów to musisz to robić element po elemencie. Np.
cout << b[i];
i w pętli. Hurtem się tego zrobić nie da.

ok, jak wypisuję to b[i] zamiast b, to wypisuje tylko buźka, buźka

Bo rzutowanie int na char nie ma sensu. Wróć do tablicy intów, to wypisywać Ci będzie jako inty.

using namespace std;

int main()
{
int a, c,d=1;
cin >> a;
int b[a+1], e[a+1];
c=a;
if (a<3) cout << "NIE";
else if (a==3)
cout << 2 << " " << 0 << " " << 3 << " " << 1;
else {
for (int i=0;i<=a;i++)
b[i]=i;
if (((a+1)%3==0)&&((a+1)%5==0))
{
for (int j=0;j<=a;j++)
{cout << b[d%(a+1)] << " ";
d=d+4;}
}
else if ((a+1)%3==0)
{
for (int j=0;j<=a;j++)
{cout << b[d%(a+1)] << " ";
d=d+5;}
}
else {
for (int j=0;j<=a;j++)
{cout << b[d%(a+1)] << " ";
d=d+3;}
}}
return 0;
}

Dla wszystkich cyfr 0-36 działa, ale przecież nie będę sprawdzał każdej do miliona...no i jednak SPOJ wyrzuca błędną odpowiedź...co tu może być źle?

Jeśli tablica b pod indeksem i zawsze przechowuje wartość i, to zamiast pisać b[i] wystarczy napisać i. Innymi słowy tablica b jest zupełnie zbędna.

Przemyśl jeszcze raz przypadki mniejsze od <= 3, czy odpowiedź jest zawsze negatywna?

Liczby powinny być rozdzielone spacjami więc końcowa spacja też może być problematyczna; potencjalnie, bo nie weryfikowałem tego z sędzią.

w poleceniu n jest <=10^6, a gdy wpisuję 1000000 do programu to się wysypuje
EDIT
Sprawdziłem i program wysypuje się dla wszystkich liczb większych od 520590

EDIT 2
Wydaje mi się, że to przez "int d", które się stale powiększa, ale gdy zadeklarowałem je jako unsigned long long to program wysypuje się dla tych samych liczb

include

using namespace std;

int main()
{
int a,d=1;
cin >> a;
int b[a+1];
if (a==0) cout << 0;
else if (a<3) cout << "NIE";
else if (a==3)
cout << 2 << " " << 0 << " " << 3 << " " << 1;
else {
for (int i=0;i<=a;i++)
b[i]=i;
while(d<a){
cout << " " << b[d];
d=d+2;}
d=0;
while (d<a)
{cout << " " << b[d];
d=d+2;}}
return 0;
}

Tutaj mam troszkę prostszy kod, ale on również wysypuje się dla większych liczb

Ok, problemem był warunek w while'u, spacje, ale także pamięć w tablicy. Po zastosowaniu tablicy dynamicznej (vectory) udało się ujrzeć ten piękny zielony kolorek :3