•PlayLikeNeverB4
|
 |
« Răspunde #50 : August 26, 2011, 22:09:35 » |
|
Pot exista spatii dupa N. Deci: fin>>n; fin.get(ec,999,'\n'); fin.get();
|
|
|
Memorat
|
|
|
|
•predator5047
Strain
Karma: -4
Deconectat
Mesaje: 8
|
 |
« Răspunde #51 : August 27, 2011, 09:51:22 » |
|
Fac asta aici: eval(ec,strlen(ec),ms,xs); fin.get(); fin.get(ec,999,'\n'); xd=md=0; eval(ec,strlen(ec),md,xd); fin.get();
|
|
|
Memorat
|
|
|
|
•PlayLikeNeverB4
|
 |
« Răspunde #52 : August 27, 2011, 12:05:35 » |
|
Eu ma refer la primul rand. Dupa ce citesti N-ul, trebuie sa citesti tot randul, pentru ca altfel iti baga caracterul '\n' la prima ecuatie.
|
|
|
Memorat
|
|
|
|
•predator5047
Strain
Karma: -4
Deconectat
Mesaje: 8
|
 |
« Răspunde #53 : August 27, 2011, 17:43:45 » |
|
|
|
|
Memorat
|
|
|
|
•PlayLikeNeverB4
|
 |
« Răspunde #54 : August 27, 2011, 21:13:11 » |
|
Prietene, vad ca nu iti place sa primesti sfaturi. Tocmai ti-am spus ca pot exista spatii dupa N. Ei, tu citesti acel spatiu, dar nu si caracterul '\n' !!
|
|
|
Memorat
|
|
|
|
•Steve
Client obisnuit

Karma: 36
Deconectat
Mesaje: 72
|
 |
« Răspunde #55 : August 28, 2011, 04:15:25 » |
|
fin >> ecuatie; a lot safer 
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #56 : August 28, 2011, 09:48:50 » |
|
Ai 2 variante : faci fin.getline (), sau faci un for si atata timp cat citesti ceva diferit de '\n', tot citesti. Eu prefer prima, sau cum a zis stefan, faci fin >> ec.
|
|
|
Memorat
|
|
|
|
•predator5047
Strain
Karma: -4
Deconectat
Mesaje: 8
|
 |
« Răspunde #57 : August 28, 2011, 11:34:11 » |
|
Scuze George nu mam gandit ca pot fi mai multe spatii credeam ca e doar unul acum iau 100p va multumesc tuturor pentru ajutor.
|
|
|
Memorat
|
|
|
|
•VisuianMihai
|
 |
« Răspunde #58 : Octombrie 07, 2011, 14:57:02 » |
|
imi poate spune si mie dc imi da eroare de compilare pe evaluatorul de aici, iar in MINGW nu imi da???
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #59 : Octombrie 07, 2011, 15:04:20 » |
|
Poate ai Mingw vechi, evaluatorul infoarena tocmai a fost schimbat  .
|
|
|
Memorat
|
|
|
|
•VisuianMihai
|
 |
« Răspunde #60 : Octombrie 07, 2011, 15:37:28 » |
|
imi da eroare la modul... eu scriu abs(b), iar aici imi da eroare cu abs(int&)... Chiar are legatura cu versiunea?
|
|
|
Memorat
|
|
|
|
•stefanzzz
Strain
Karma: 3
Deconectat
Mesaje: 7
|
 |
« Răspunde #61 : Octombrie 11, 2011, 17:20:04 » |
|
Nu inteleg de ce iau 0 p . Am incercat pe toate testele de la OJI si imi ies foarte bine . Spuneti-mi si mie daca gresesc ceva . #include <fstream> #include <iomanip> using namespace std; ifstream f("ecuatii2.in"); ofstream g("ecuatii2.out");
char c; int n,x,xc,nc,semn,s;
int main() { int i; f>>n; for(i=1;i<=n;i++){ xc=0; nc=0; semn=1; s=1; c='1'; while(c!='\n'&&!f.eof()){ f.get(c); while(!f.eof()&&(c==' '||c=='\n')) f.get(c); if(c=='-'){ s=-1; f.get(c);} if(c=='x'){ xc+=s*semn; s=1; if(!f.eof()) f.get(c);} else{ x=c-'0'; f.get(c); while(c>='0'&&c<='9'){ x=x*10+c-'0'; f.get(c);} if(c=='x'){ xc+=semn*s*x; s=1; f.get(c);} else{ nc+=semn*s*x; s=1;}} if(c=='-') s=-1; if(c=='+') s=1; if(c=='=') semn=-1;} nc*=(-1); if(xc==0){ if(nc==0) g<<"infinit"; else g<<"imposibil";} else{ g<<fixed; g<<setprecision(4)<<nc*1.0/xc;} g<<'\n';} f.close(); g.close(); return 0; }
|
|
|
Memorat
|
|
|
|
•VisuianMihai
|
 |
« Răspunde #62 : Octombrie 14, 2011, 20:21:03 » |
|
De ce imi da killed by signal??? Am declarat taote tablourile [255] si am inceput de la 0..
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #63 : Octombrie 14, 2011, 21:22:56 » |
|
Ia testul si vezi care-i pb ....
|
|
|
Memorat
|
|
|
|
•Andrei.Xwe
Strain
Karma: -4
Deconectat
Mesaje: 38
|
 |
« Răspunde #64 : Iunie 04, 2012, 10:13:39 » |
|
Ma chinui de doua zile sa fac problema asta si tot nu-mi iese...  Am luat testele de la OJI si pe toate obtin acelasi rezultat ca in .ok...nu inteleg de ce pe infoarena nu iau niciun punct.... #include<fstream> using namespace std; #include<cstring> #include<cstdio> char c[260]; int i,n,numar,x1,x2,s1,s2,t,semn; int main() { ifstream fcin("ecuatii2.in"); FILE *fcout=fopen("ecuatii2.out","w"); fcin>>t; while(t--) { fcin.get(); fcin.get(c,260,'\n'); n=strlen(c); x1=x2=s1=s2=numar=0; semn=1; for(i=0;c[i]!='=';i++) { if('0'<=c[i] && c[i]<='9') numar=numar*10+c[i]-'0'; else if(c[i]=='x') if(numar==0) x1+=semn; else x1=x1+semn*numar,numar=0; else s1=s1+semn*numar,numar=0; if(c[i]=='-') semn=-1; if(c[i]=='+') semn=1; } s1+=numar*semn; semn=1; numar=0; for(;i<n;i++) { if('0'<=c[i] && c[i]<='9') numar=numar*10+c[i]-'0'; else if(c[i]=='x') if(numar==0) x2+=semn; else x2=x2+semn*numar,numar=0; else s2=s2+semn*numar,numar=0; if(c[i]=='-') semn=-1; if(c[i]=='+') semn=1; } s2+=numar*semn; x1-=x2; s1-=s2; if(x1==0) if(s1==0) fprintf(fcout,"infinit\n"); else fprintf(fcout,"imposibil\n"); else if((double)s1/x1==0) fprintf(fcout,"0.0000\n"); else fprintf(fcout,"%.4lf\n",(double)-s1/x1); } return 0; }
Later edit: problema era ca puteau fi mai multe spatii pe primul rand dupa ce citeam numarul ecuatiilor....am pus inainte de citirea ecuatiilor fcin.get(asa,100000); si fcin.get() si am luat 100 
|
|
« Ultima modificare: Iunie 04, 2012, 10:26:41 de către Cobzaru Adrian-Andrei »
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #65 : Septembrie 26, 2012, 18:32:40 » |
|
Nu înțeleg un lucru...  De ce în exemplu de la problema nu e un "x" la datele de ieșire... Și un test oficial de la OJI arată așa: IN: 9 999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+1000=x-1000 1-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999-999=3x 1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987=1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+1000+1000+999+987+456 0=999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+999x+10x 999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+1000=2-7x 78x-56=90x+100 999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+999+9=x 9-x-10=x-x-x-x+9 2+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x=x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+2
OUT: x 62939.0000 -20312.6667 imposibil -0.0000 -8848.1429 -13.0000 62946.0000 10.0000 infinit
|
|
|
Memorat
|
|
|
|
•stardust
Strain
Karma: 13
Deconectat
Mesaje: 39
|
 |
« Răspunde #66 : Septembrie 26, 2012, 19:07:55 » |
|
x-ul ala nu ar trebui sa fie acolo. Uita-te ca ai 9 ecuatii deci trebuie sa afisezi 9 raspunsuri. O fi fost vreo scapare dar avand in vedere ca aici a luat lumea 100 nu iti face griji din cauza asta.
|
|
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #67 : Octombrie 03, 2012, 17:44:49 » |
|
Am luat 100 de puncte  ( nu am scris în fișier acel x )
|
|
« Ultima modificare: Octombrie 04, 2012, 08:55:20 de către Birisan Razvan »
|
Memorat
|
|
|
|
•misino
Strain
Karma: 10
Deconectat
Mesaje: 40
|
 |
« Răspunde #68 : Octombrie 22, 2012, 10:55:30 » |
|
fisierul de intrare/iesire se termina cu '\n'?
|
|
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #69 : Octombrie 22, 2012, 17:58:03 » |
|
Nu știu dacă contează  La mine arată așa: Rezultat_ec1\n Rezultat_ec2\n Rezultat_ec2\n \0
Important e să afișezi pe rândul i rezultat ecuației de pe linia i + 1. 
|
|
|
Memorat
|
|
|
|
•repp4radu
|
 |
« Răspunde #70 : Octombrie 23, 2012, 14:59:32 » |
|
Eu iau TLE pe problema asta pe toate testele. Am verificat-o pe testele de la OJI si mergea in timp f scurt pe fiecare test dat. Ma puteti ajuta sa o scot in timp? 
|
|
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #71 : Octombrie 23, 2012, 19:03:07 » |
|
Iei TLE pentru că ideea ta e prea complicată.Încearcă să o simplifici.  Te pot ajuta să o faci dacă îmi zici algoritmul pe care îl folosești ( Ar fi mai bine dacă ai reuși să-ți dai seama singur ce ai putea să simplifici  )
|
|
|
Memorat
|
|
|
|
•repp4radu
|
 |
« Răspunde #72 : Octombrie 24, 2012, 14:20:38 » |
|
Merg pe principiul de la evaluarea unei expresii, doar ca mult mai simplu din cauza ca aici nu am decat + si -(deci nu mai apare prioritatea operatorilor). Tin minte ceva de forma: A * x = B daca A == 0 am 2 cazuri: B = 0 (infinit) si B != 0 (imposibil) In caz contrar x = B / A.
Am compexitate liniara pt fiecare expresie.
|
|
|
Memorat
|
|
|
|
•TheNechiz
|
 |
« Răspunde #73 : Octombrie 24, 2012, 17:15:03 » |
|
Ideea e bună.  Aceeași idee am folosit-o și eu. Dar tu ai luat 0p pe : #include <fstream> #include <string.h> #include <stdlib.h> #include <iomanip>
#define MAX 300 #define INF 0x3f3f3f3f
using namespace std;
char sir[MAX], *end;
pair<int, int> eval(char* s) { pair<int, int> result; result.first = 0; result.second = 0; char semn = '+', *p; int a; p = s; while(p <= end && *p != '=') { if(*p == '+' || *p == '-') { semn = *p; p++; } if('0' <= *p && *p <= '9') { a = atoi(p); while(*p >= '0' && *p <= '9') p++; if(*p == 'x') { switch(semn) { case '+': result.first += a; break; case '-': result.first -= a; break; } p++; } else { switch(semn) { case '+': result.second += a; break; case '-': result.second -= a; break; } } } if(*p == 'x') { switch(semn) { case '+': result.first++; break; case '-': result.first--; break; } p++; } } return result; }
double solve() { char *p = strchr(sir, '='); pair<int, int> l = eval(sir), r = eval(p + 1); l.first -= r.first; r.second -= l.second; if(!l.first) { if(!r.second) return INF; return -INF; } return (double)r.second/(double)l.first; }
int main() { ifstream in("ecuatii2.in"); ofstream out("ecuatii2.out"); int n; in.getline(sir, MAX); n = atoi(sir); double a; while(n--) { in.getline(sir, MAX); end = &sir[strlen(sir) - 1]; a = solve(); if(a == -INF) out<<"imposibil\n"; else if(a == INF) out<<"infinit\n"; else out<<fixed<<setprecision(4)<<a<<"\n"; } in.close(); out.close(); return 0; }
Și cineva a luat 100p pe : #include <fstream> #include <string.h> #include <stdlib.h> #include <iomanip>
#define MAX 300 #define INF 0x3f3f3f3f
using namespace std;
char sir[MAX], last;
pair<int, int> eval(char* s) { pair<int, int> result; result.first = 0; result.second = 0; char semn = '+', *p; int a; p = s; bool ok = false; while(*p != '\n' && *p != '=') { if(*p == last) ok = true; if(*p == '+' || *p == '-') { semn = *p; p++; } if('0' <= *p && *p <= '9') { a = atoi(p); while(*p >= '0' && *p <= '9') p++; if(*p == 'x') { switch(semn) { case '+': result.first += a; break; case '-': result.first -= a; break; } p++; } else { switch(semn) { case '+': result.second += a; break; case '-': result.second -= a; break; } } } if(*p == 'x') { switch(semn) { case '+': result.first++; break; case '-': result.first--; break; } p++; } if(ok) break; } return result; }
double solve() { char *p = strchr(sir, '='); pair<int, int> l = eval(sir), r = eval(p + 1); l.first -= r.first; r.second -= l.second; if(!l.first) { if(!r.second) return INF; return -INF; } return (double)r.second/(double)l.first; }
int main() { ifstream in("ecuatii2.in"); ofstream out("ecuatii2.out"); int n; in.getline(sir, MAX); n = atoi(sir); double a; while(n--) { in.getline(sir, MAX); last = sir[strlen(sir) - 1]; a = solve(); if(a == -INF) out<<"imposibil\n"; else if(a == INF) out<<"infinit\n"; else out<<fixed<<setprecision(4)<<a<<"\n"; } in.close(); out.close(); return 0; }
Nu m-am uitat la cele două surse cu lupa,dar singura diferență vizibilă (sursele sunt foarte asemănătoare ) este un BREAK. 
|
|
|
Memorat
|
|
|
|
•repp4radu
|
 |
« Răspunde #74 : Octombrie 24, 2012, 17:59:17 » |
|
Stiu sursa aceea, fiind scrisa de un prieten la care am apelat cu problema aceasta. Aceea e sursa mea initiala putin modificata. Din pacate nu ma prind de ce solutia aceea ia 100 si a mea ia 0. Diferenta acolo sunt astea 3 linii: if(*p == last) ok = true; if(ok) break; last = sir[strlen(sir) - 1];
Dupa parerea mea aici la prima aparitie a ultimului caracter din sir se va iesi din while. Chestie incorecta dupa parerea mea(presupunand ca ultimul caracter din sir e un x, s-ar opri la primul x din sir). Am incercat sa fac ceva asemanator, luand un pointer end egal cu sfarsitul sirului. Acum m-am prins si care era problema. Aveam cazuri pentru care nu mai incrementam pointer-ul si nu ajungeam la sfarsit. Am facut acum niste improvizatii si iau Gresit, dar alea se rezolva  Mersi de ajutor 
|
|
|
Memorat
|
|
|
|
|