Jump to content
php.lv forumi

programmēšanas olimpiāde


laucinieks

Recommended Posts

  • Replies 55
  • Created
  • Last Reply

Top Posters In This Topic

Šodien atradu, ka olimps piedāvā iespēju iesūtīt uzdevumus un pārbaudīt cik no cik punktiem dabūji. Nu tad sāku sūtīt, pirmo iesūtu - 5/5, otro iesūtu 0/5, trešo iesūtu - 0/5 u.t.t. Pašam uz datora viss iet, bet tur 0/5. Otrā uzd. kods ir šāds -

#include <iostream>
#include <fstream>
using namespace std;
int main() {
std::ifstream input_file("taisnst.in");
int n;
int m;
int d;
input_file >> n >> m;
while (n != m)
{
     	if (n > m) {
           	n = n - m;
           	}
     	if (m > n) {
           	m = m - n;
           	}
     	d++;
}
std::ofstream output_file("taisnst.out");
output_file << d << std::endl;
return 0;
}

 

Uz datora viss perfekti izvadās, bet tur pat vienu punktu neiedod, ir nojausma kādēļ? Uzdevuma apraksts šeit - http://www.lio.lv/ol...vumi.php?show=5

+ vēl viena lieta, vai ir kāda iespēja, kā var noteikt programmas izpildes laiku?

L.

Edited by laucinieks
Link to comment
Share on other sites

Edit: Tikko sapratu, kur bija kļūda -

#include <iostream>
#include <fstream>
using namespace std;
int main() {
std::ifstream input_file("taisnst.in");
int n;
int m;
int d = 1;
input_file >> n >> m;
while (n != m)
{
     	if (n > m) {
           	n = n - m;
           	}
     	if (m > n) {
           	m = m - n;
           	}
     	d++;
}
std::ofstream output_file("taisnst.out");
output_file << d << std::endl;
return 0;
}

 

Tagad vajadzētu strādāt 100% pareizi, bet tāpat dabūju tikai 1/5 punktiem.

L.

Link to comment
Share on other sites

tev tajā programmā d netiek inicializēts, tāpat arī otrā pārbaude ciklā ir pēc pirmās pārbaudes, kurā tiek izmainītas jau n un m vērtības.

 

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
freopen ("taisnst.out","w",stdout);
freopen ("taisnst.in","r",stdin);
int a,b,c=0;
cin >> a >> b;
while (a!=b and a>0 and b>0) {
   	if(a>b) {
       	c+=a/b;
       	a=a%b;
   	} else {
       	c+=b/a;
       	b=b%a;
   	}
}
cout << c;
}

 

P.S. ērti ir lietot freopen, vari standart inputam piekabināt failu, izstrādes laikā nokomnetēt stdout, un lietot visas standart funkcijas, lai rezultātu saņemtu konsolē, bet sūtot uz servri atkomentēt un stdout tiks rakstīts failā.

Edited by codez
Link to comment
Share on other sites

tev tajā programmā d netiek inicializēts, tāpat arī otrā pārbaude ciklā ir pēc pirmās pārbaudes, kurā tiek izmainītas jau n un m vērtības.

 

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
freopen ("taisnst.out","w",stdout);
freopen ("taisnst.in","r",stdin);
int a,b,c=0;
cin >> a >> b;
while (a!=b and a>0 and b>0) {
   	if(a>b) {
       	c+=a/b;
       	a=a%b;
   	} else {
       	c+=b/a;
       	b=b%a;
   	}
}
cout << c;
}

 

P.S. ērti ir lietot freopen, vari standart inputam piekabināt failu, izstrādes laikā nokomnetēt stdout, un lietot visas standart funkcijas, lai rezultātu saņemtu konsolē, bet sūtot uz servri atkomentēt un stdout tiks rakstīts failā.

 

Hmm, tavs variants nostrādā, bet es tagad te īsti nesaprotu, kāpēc viņš nostrādā?

Jo praktiski pieņemsim, ka ievadfailā ir skaitlis - 10 un 4

Tātad programma nolasa tos failus un dara sekojošo 10 piešķir n; 4 piešķir m un nodefinē jaunu mainīgo d.

Tātad sākas cikls un notiek pirmādarbība -

d = 2,5 (10/4)

n = 2 (10%4)

Nākošā darbība ir

d = 4,5 (2,5 + 4/2)

m = 0

pēdējā darbība ir

d = 4,5 (4,5 + 2/0)

n = 2%0 (kam nevajadzētu izpildīties).

 

Es laikam esmu kaut ko ne tā izpratis vai ne?

L.

Edited by laucinieks
Link to comment
Share on other sites

10/4 == 2, nevis 2.5, ja to dara ar int tipa mainīgajiem - veseliem skaitļiem jeb vienkārši izsakoties, tā ir dalīšana bez atlikuma.

 

Respektīvi, vienā solī, es nogriežu visus iespējamos kvadrātus ar īsākās taisnstūra malas platuma garumu.

Edited by codez
Link to comment
Share on other sites

Iesūtot trešo uzdevumu, kurš arī uz datora it kā gāja, bet tur parādījās 0/10 sāku labot viņu un nonācu pie pilnīgi cita, manuprāt daudz efektīvāka risinājuma (Vismaz īsāka), bet viņš kaut kā negrib pareizi darboties. Ja sākas desmiti un simti, aiziet nepareizi.

Kods - http://paste.php.lv/...2da706?lang=cpp

Uzd - http://www.lio.lv/ol...umi.php?show=11

Tagad, mēģinu uz papīra uzzīmēt, kā skriptam vajadzētu pildīt uzdevumu, respektīvi ja ir 3, tad vajadzētu būt tā -

n0 = 3;

n1 = 3 + 3 + 3;

n2 = 9 + 9 + 9;

n3 = 27 + (27%10 + 27/10) + (27%10 * 27/10);

Bet, viņš no kaut kurienes izrauj maģiskus skaitļus.

L.

 

EDIT: viss sanāca, kā parasti, mūžīgo kļūdu pielaižu.

 

EDIT2: Tā, tagad ir tikai 3/10 punktiem, mērķis ir dabūt 10/10 :). Varbūt variet iedot kādus hintus, ko vajadzētu pielabot?

http://paste.php.lv/031b4e2cca024eed23b8cc3290cc6f6f?lang=cpp

Edited by laucinieks
Link to comment
Share on other sites

Sāc ar to, ka abstrahē kodu, izveidojot funkcijas ciparu summai un ciparu reizinājumam

 

int cipsum (int a){

 ...
}

int cipreiz (int a){
 ...
}

Tad pārbaudi vai funkcijas strādā pareizi un tālāk jau turpini paša pamatalgorimta būvi, izmantojot šīs funkcijas.

 

 

EDIT: tāpat, ja ir zināms iterāciju skaits, vajag izmantot for, nevis while ciklu

 

Atvērt šo tikai tad, kad pats esi izdomājis risinājumu:

 

 

Edited by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...