infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din August 14, 2007, 10:34:24



Titlul: 480 Ecuatii 2
Scris de: Adrian Diaconu din August 14, 2007, 10:34:24
Aici puteţi discuta despre problema Ecuatii 2 (http://infoarena.ro/problema/ecuatii2).


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Andrei Homorodean din August 14, 2007, 11:16:34
Testele sunt aceleasi ca si cele de la oji? Mie imi merg cele pe care le pic. job: http://infoarena.ro/job_detail/77413


Titlul: Răspuns: 480 Ecuatii 2
Scris de: HighScore din August 14, 2007, 11:20:41
probabil ca nu, avand in vedere ca daca ar fi aceleasi toata lumea le-ar sti...si ar putea pur si simplu sa faca un prog cu un switch si sa ia max.... :-'


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Andrei Homorodean din August 14, 2007, 12:02:43
Si asa ar putea trimite surse oficiale, si unde e diferenta? Sursa e scrisa mai demult, dar am testat pe testele oficiale si pare ok.           


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Adrian Diaconu din August 14, 2007, 12:11:51
E ok sursa.
Am reevaluat problema.

Lipsea fisierul de verificare. (Se comparau outputurile si probabil diferea pe la unele zecimale)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Andrei Homorodean din August 14, 2007, 12:15:34
Se mai intampla. Ok, multumesc!


Titlul: Răspuns: 480 Ecuatii 2
Scris de: alexandru andronache din August 24, 2007, 14:17:17
Am luat testele oficiale si imi merg toate dar evaluatorul imi da 0 pct.. Imi puteti da ceva idei ce ar putea fi gresit?


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Codrea Marcel din August 24, 2007, 14:20:39
Probabil e de la citire...Incearca sa citesti folosind functia fgets !


Titlul: Răspuns: 480 Ecuatii 2
Scris de: alexandru andronache din August 24, 2007, 15:43:11
Nu cred ca e de la citire ca am si avut pb si la testele oficiale... Cred ca e la afisare vreo problema. Afisare are ceva deosebit? Ca am vazut ca la testele oficiale pe primul rand se pune un x si in plus am vazut ca afiseaza si 0.0000 si -0.0000..


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Bogdan-Alexandru Stoica din August 24, 2007, 16:32:11
incearca sa pui si tu acel 'x' si vezi cat iei. daca marchezi tot 0 puncte, incearca ceva de genul:

Cod:
if ( (raspuns_ec_1 != 'infinit') &&  ... && (raspuns_ec_4 != 'infinit') ) return 69; 

daca ai vre'o problema la citire/modul in care interfereaza programul tau cu evaluatorul, la primul test ar trebui sa primesti eroarea 'Non zero exit status." (sper ca am scris bine)

(poti sa incerci sa faci acelasi smen si pentru alte teste)

LE:
Cod:
format '%c' expects type 'char*', but argument 3 has type 'char (*)[1]' 

incearca sa folosesti '%s' pentru 'char s[ x ]', x > 1 sau 'char s' in loc de 'char s[ 1 ]' si citeste cu '%c' (suna dubios 'char s[ 1 ]')


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Sebastian Crisan din Septembrie 30, 2007, 11:45:51
Eu iau 30 de puncte. Am verificat cu evaluatorul oficial si primesc 100 puncte. http://infoarena.ro/job_detail/88098


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Gabriel Bitis din Septembrie 30, 2007, 11:54:52
Daca dai o privire prin monitorul de evaluare, vei vedea ca sunt destul de multi cu 100 p, deci mai ai de optimizat ceva, sau ai gresit la implementare.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Andrei Homorodean din Septembrie 30, 2007, 12:14:25
Eu as zice sa se mai uite cineva peste evaluator. Pot aparea prb de precizie. Si cand am postat eu erau multe de 100. :)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Bogdan-Alexandru Stoica din Octombrie 01, 2007, 22:26:38
incearca sa afisezi cu 4 (5) zecimale. cu toate ca sunt maxim 10 ecuatii intr-un fisier, poate ca ai omis ceva cant te-ai verificat. pentru mai multa siguranta confrunta outputul tau cu cel oficial scriind un 'file compare' sau folosind pe cel din windows:

Cod:
fc file1.txt file2.txt

sper ca nu am gresit codul si imi cer scuze anticipat daca ai facut deja lucrul asta, iar sfatul meu este inutil. :)



Titlul: Răspuns: 480 Ecuatii 2
Scris de: Andrei Misarca din Februarie 03, 2008, 18:00:08
Nu inteleg de ce imi zice la toate testele Killed by signal 11... mai ales k pe evaluatorul ofcial am luat 100 de puncte


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Ionescu Robert Marius din Februarie 04, 2008, 15:14:35
mishu ai grija cum faci citirea ca eu am patit lafel,pe evaluator luam 100 si aicea 0 pct  :wink:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Andrei Misarca din Februarie 04, 2008, 20:27:18
pai cu fgets...  :?

Editat de admin: Problema era k am uitat sa modific fisieru de intrare... lasasem "ecuatii.in" in loc de "ecuatii2.in" ](*,) pan la urma am luat 100 :yahoo:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mihai Calancea din Februarie 09, 2009, 21:45:38
Si eu iau 30 :-k Pe testele de la OJI merge perfect .Folosesc fscanf pentru citire (cu fgets iau 0). Am incercat sa afisez si 5 zecimale, same thing. I'm out of ideas :?. A little help please? :D I'd be grateful.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Florian Marcu din Februarie 09, 2009, 22:16:14
Citirea mea arata asa:

Cod:
 int main()  
     { 
     long t; 
     fscanf(f,"%ld",&t); 
     for(int i=1;i<=t;++i) 
         { 
         fscanf(f,"%s",v); 
         rezolva(); 
         } 
     return 0; 
     } 

Si afisarea:
Cod:
  fprintf(g,"%.4f\n",pr);  
A mers perfect. Spor!


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mihai Calancea din Februarie 10, 2009, 20:49:37
Mersi mult :D Dar nu era asta problema.
Programul afisa "Imposibil" si "Infinit" in loc de "imposibil" respectiv "infinit" :-' si chestia asta m-a tinut in 30p 2 zile. Daca patesc chestia asta la OJI :horsy:

:D


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Carabet Cosmin Andrei din Mai 28, 2009, 01:04:58
Am o nelamurire...Iau 0 pct pe problema asta,desi imi dau bn toate testele de la oji.Sa fie ceva de la citire?Citirea o fac cu fgets...Astept sfaturi.
Mersi anticipat


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Bogdan Vlad din Octombrie 10, 2009, 11:59:20
 :D Cum sa pun setprecision (4) daca folosesc limbaj C in stdio ?  :-k


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Sima Cotizo din Octombrie 10, 2009, 12:13:43
Cod:
printf("%.4f", numar_float); 
printf("%.4lf", numar_double);

RTM (http://www.cplusplus.com/reference/clibrary/cstdio/printf/)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Bogdan Vlad din Octombrie 10, 2009, 12:22:30
:D Cum sa pun setprecision (4) daca folosesc limbaj C in stdio ?  :-k
mrs frumos


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Johnsons Babi Minune din Ianuarie 24, 2010, 15:08:08
problema :( iau 0 puncte desi pe testele oficiale merge bine

sursa : http://infoarena.ro/job_detail/386267?action=view-source


Titlul: Răspuns: 480 Ecuatii 2
Scris de: alexandru din Ianuarie 24, 2010, 15:35:55
Ai pus %D la primul fscanf :)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Johnsons Babi Minune din Ianuarie 24, 2010, 16:22:46
ms frumos  ??? nu inteleg de ce pe teste a mers si pe infoarena nu /:| chestiile astea sunt ciudate, nu cred ca o sa inteleg vreodata


Titlul: Răspuns: 480 Ecuatii 2
Scris de: A Cosmina - vechi din Ianuarie 24, 2010, 16:31:01
Limbajele C si C++ sunt CaseSensitive, adica fac diferenta intre majuscule si minuscule.

Spre exemplu, pot sa declari variabilele min, Min sau MIN si fiecare va stoca o valoare diferita. In Pascal min este tot una cu MIN. :)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: alexandru din Ianuarie 24, 2010, 16:38:33
ms frumos  ??? nu inteleg de ce pe teste a mers si pe infoarena nu /:| chestiile astea sunt ciudate, nu cred ca o sa inteleg vreodata
Defapt daca compilezi cu
Cod:
g++ file_name.cpp -static  -W -O2 -o file_name -lm
(pt c++ ) 
Cod:
gcc file_name.c -static  -W -O2 -o file_name -lm
(pt c )
nu o sa mearga... :)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Pripoae Teodor Anton din Ianuarie 24, 2010, 17:06:11
Linux-ul este case sensitive, windows-ul nu.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Simoiu Robert din Ianuarie 24, 2010, 17:26:18
 ??? Adica ce vrei sa zici, ca windows-ul nu este case sensitive? Eu cred ca da  #-o


Titlul: Răspuns: 480 Ecuatii 2
Scris de: alexandru din Ianuarie 24, 2010, 17:27:33
Linux-ul este case sensitive, windows-ul nu.
Daca te referi la comenzi da :)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Pripoae Teodor Anton din Ianuarie 24, 2010, 20:41:30
Ma refeream la comenzi, la fisiere, si probabil poate fi si "%D" case insensitive pe windows. Nu stiu, pt ca nu lucrez pe windows. In orice caz, cred ca difera de la un compilator la altul cum gestioneaza acest format.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: alexandru din Ianuarie 25, 2010, 13:07:56
Ma refeream la comenzi, la fisiere, si probabil poate fi si "%D" case insensitive pe windows. Nu stiu, pt ca nu lucrez pe windows. In orice caz, cred ca difera de la un compilator la altul cum gestioneaza acest format.
Difera de la compilator la compilator nu de la OS la OS. Si pe linux merge sursa, compilata cu
Cod:
g++ file_name.cpp -o file_name
Si asta e o parte ciudata cu ce influenteaza acele flaguri ( vezi mai sus ) ( adica de ce fara ele mere perfect sursa ) ?. 


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Bogdan Vlad din Februarie 24, 2010, 10:30:15
salut, :shock:
cum e posibil sa iau raspuns gresit pe toate testele.... stiind ca-mi da bine pe teste de la oji .. iar pe campion am luat 100 de puncte pe ea  :eyebrow:
heeeelp pls :)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Dragos-Alin Rotaru din Februarie 24, 2010, 10:39:32
Aceeasi problema o avea un coleg . Inlocuieste citirea cu scanf ("%s\n", a) si dupa ai grija de cazurile in care trebuia sa imparti la 0.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Bogdan Vlad din Februarie 25, 2010, 21:23:55
asta era  :D :ok: :yahoo:
mrs frumos. poate mai sunt si alti patiti ca mine  :-'


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Vlad Tarniceru din Februarie 28, 2010, 17:35:11
Salut  :D
Cum se face ca iau 20 de puncte :wink: ?Adica nu-mi dau seama la ce am gresit(dar presupun ca stiu)
Cod:
#include<fstream.h>
#include<string.h>
#include<math.h>
 ifstream f("ecuatii2.in");
  ofstream g("ecuatii2.out");
    int mod(double a){
        if(a<0) return a*-1;
        return a;
    }
    int cifra(char a){
        if(a>='0' && a<='9') return 1;
        return 0;
    }
    int main(){
        char a[256],semn='+';
        int nr2,n,i,l,j,ret,l2;
        double lit,cif,nr,nr3;
        f>>n;
        for(i=1;i<=n;i++){
            f>>a;//f.get(a,255);
            f.get();
            j=0;
            while(a[j]!='=') j++;
            nr2=j;
            l=strlen(a);
            l2=l;
            semn='+';
            j=0;
            lit=0;
            cif=0;
            while(/*a[j-1]!='=' && a[j]!='=' && j<l*/j<nr2){//mergi pana la egal('=')
                //g<<"da\n";
                if(cifra(a[j])){//daca a[j] este cifra
                    nr=0;
                    if(j>0) semn=a[j-1];
                    while(cifra(a[j]) && a[j]!='='){//cat timp a[j] este cifra
                        nr=nr*10+(a[j]-'0');
                        j++;
                    }
                    if(semn=='+'){
                        if(a[j]=='x') lit=lit+nr;
                        else
                        cif=cif+nr;
                    }
                    else if(semn=='-'){
                         if(a[j]=='x') lit=lit-nr;
                         else
                         cif=cif-nr;
                    }
                }
                else
                if(a[j]=='x'){if(j>0) semn=a[j-1];if(semn=='+') lit++;else lit--;}
                j++;
            }
            j=j-(j-nr2);
            ret=j+1;
            j++;
            //g<<a[j]<<"\n";
            semn='+';
            l=l2;
            while(j<l){
                if(cifra(a[j])){//daca a[j] este cifra
                    if(a[j-1]!='=') semn=a[j-1];
                    nr=0;
                    while(cifra(a[j]) && j<l){//cat timp a[j] este cifra
                        nr=nr*10+(a[j]-'0');
                        j++;
                    }
                    if(semn=='+'){
                        if(a[j]=='x') lit=lit-nr;
                        else
                        cif=cif-nr;
                    }
                    else if(semn=='-'){
                         if(a[j]=='x') lit=lit+nr;
                         else
                         cif=cif+nr;
                    }
                }
                else
                if(a[j]=='x'){if(a[j-1]=='-' || a[j-1]=='+') semn=a[j-1];if(semn=='+') lit--;else lit++;}
                j++;
            }
            //if(cif<0) cif=cif*-1;
            //if(lit<0) lit=lit*-1;
            //if(cif<0){cif=cif*-1;lit=lit*-1;}
            nr3=cif/lit;
            if(nr3<0) cif=cif*-1;//aici!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!cred ca nu e bine ca //uneori afiseaza numar negativ  :-k
            if(lit!=0) g<<cif/lit<<"\n";
            else
            if(lit==0 && cif!=0) g<<"imposibil\n";
            else
            if(lit==0 && cif==0) g<<"infinit\n";
            //g<<cif<<" "<<lit<<"\n";
            //g<<a[0]<<"\n";
        }
        g.close();
        return 0;
    }


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Okros Alexandru din Martie 17, 2011, 19:30:02
Nu inteleg de ce i-au Time limit exceeded pe toate testele .
Pe testele de la OJI imi iese perfect .


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Junc Raul Cosmin din Martie 18, 2011, 18:00:09
S-au pastrat testele oficiale? Ca eu primesc doar 90 de pc  :'( si am verificat cu testele de la OJI si am vz ca imi dau toate bn... Nu stiu unde am gresit... La testul 9 imi zice ca ii gresit...
Ma poate ajuta cineva?


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Trifan Mircea Mihai din Mai 24, 2011, 22:35:20
Junc Raul Cosmin:
Si eu am patit la fel dar am rezolvat google'ind un pic.
Ca sa iti iasa trebuie sa incluzi biblioteca
Cod:
<iomanip>
, iar pentru afisare (eu am folosit stream-uri) trebuie sa scrii:
Cod:
g<<fixed;
g<<setprecision (4)<<x<<"\n";
unde
Cod:
x
iti este necunoscuta.
bafta!  :D


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Oancea Catalin din Iunie 09, 2011, 09:17:35
Ce trebuie afisat pentru ceva de genu' 5=5 ? (exista teste de acest fel?)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Ciprian Olariu din Iunie 09, 2011, 13:57:18
Pai daca ar exista un astfel de test,fara x,in caz de egalitate ar trebui afisat "infinit",iar altfel "imposibil"  ???


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Oancea Catalin din Iunie 09, 2011, 17:14:10
arunci i8nseamna ca nu e de la asta. Iau doar 10 puncte...si pe testele de la oji 100... Daca afisez cu precizie mai mare are ceva?
Cod:
fout<<setprecision(10)<<val;


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Paul-Dan Baltescu din Iunie 09, 2011, 17:23:42
Cel mai probabil, nu. Insa vezi ca setprecision face ceva rotunjuri implicite dupa un numar oarecare de cifre dupa virgula (nu mi-e foarte clar procedeul). Ca sa afisezi exact cu 10 zecimale ar trebui sa faci:

Cod:
fout << fixed << setprecision(10) << val;

Testeaza intai la tine pe calculator si vezi daca observi diferente.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Ciprian Olariu din Iunie 09, 2011, 18:08:41
Mda,la ONI am avut ceva probleme cu acest setprecision la evaluarea pe linux  :thumbdown:

Cred ca ai putea incerca mai bine sa pui citirea/afisarea pe cstdio , iar la afisare sa folosesti asta pentru afisare cu precizie  :peacefingers: :
Cod:
printf("%.4f\n",sol);


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Oancea Catalin din Iunie 09, 2011, 18:18:15
gata... am rezolvat... nu era de la precizie. Cred ca era de la citire, insa am rescris sursa complet si iau 100 de puncte chiar daca da rateuri grosolane pe anumite teste.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: UAIC.VlasCatalin din August 11, 2011, 23:46:30
Am vazut multe surse de 40 puncte, si eu la fel nu pot trece de 40, cei care au reusit sa gaseasca problema spuneti-mi si mie care e faza, pls ](*,)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: UAIC.VlasCatalin din August 12, 2011, 00:48:45
LE: Ooops, a fost o greseala prosteasca la determinarea coeficientilor, dar am rezolvat deja :ok:  :banana:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Butiu Alexandru Octavian din August 26, 2011, 21:44:19
Nu inteleg de ce iau doar 40P pe evaluatorul de la oji iau 100P , nu inteleg unde gresesc.Am folosti fprintf in loc de fout<<fixed<<setprecision(4) am incercat sa cresc precizia la  10  nimic nu merge.
Sursa mea:
Cod:
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
void eval(char *ec,int n,int & mem,int & x);
int main()
{
    ifstream fin("ecuatii2.in");
    FILE *g=fopen("ecuatii2.out","w");
    char ec[250];
    int n,xs,xd,ms,md;
    fin>>n;
    fin.get();
    for(int i=1;i<=n;++i)
    {
        xs=xd=ms=md=0;
        fin.get(ec,999,'=');
        xs=xd=ms=md=0;
        eval(ec,strlen(ec),ms,xs);
        fin.get();
        fin.get(ec,999,'\n');
        xd=md=0;
        eval(ec,strlen(ec),md,xd);
        fin.get();
        if(ms==md&&xs==xd)
            fprintf(g,"infinit \n");
        else
        {
            int ter=ms-md,x=xs-xd;
            if(x==0 && ms!=md)
                fprintf(g,"imposibil \n");
            else
            {
                double rez=(double)ter/(x*-1);
                fprintf(g,"%.4f \n",rez);
            }

        }
    }

    fin.close();
    fclose(g);
    return 0;
}

void eval(char *ec,int n,int & mem,int & x)
{
    int nr=0; char c,semn;
    for(int i=0;i<n;++i)
    {
        nr=0;
        if(ec[i]>='0'&&ec[i]<='9')
        {
            if(i==0) semn='+';
            else semn=ec[i-1];
            while(ec[i]>='0'&&ec[i]<='9'&&i<n)
            {
                c=ec[i];
                nr=nr*10+atoi(&c);
                ++i;
            }
            if(i==n) --i;
            if(ec[i]=='x')
            {

                if(nr==0) ++x;
                else if(semn=='+') x+=nr;
                else x-=nr;
                ++i;
            }
            else
            {
                if(semn=='+') mem+=nr;
                else mem-=nr;
            }
        }
        else if(ec[i]=='x')
        {
            if(i==0) semn='+';
            else semn=ec[i-1];
            if(semn=='+') ++x;
            else --x;
        }
    }
}
 


Titlul: Răspuns: 480 Ecuatii 2
Scris de: George Marcus din August 26, 2011, 22:09:35
Pot exista spatii dupa N.
Deci:
Cod:
fin>>n;
fin.get(ec,999,'\n');
fin.get();


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Butiu Alexandru Octavian din August 27, 2011, 09:51:22
Fac asta aici:
Cod:
eval(ec,strlen(ec),ms,xs);
       fin.get();
        fin.get(ec,999,'\n');
        xd=md=0;
        eval(ec,strlen(ec),md,xd);
        fin.get();


Titlul: Răspuns: 480 Ecuatii 2
Scris de: George Marcus din 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.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Butiu Alexandru Octavian din August 27, 2011, 17:43:45
Fac deja asta aici
Cod:
fin>>n;
fin.get();


Titlul: Răspuns: 480 Ecuatii 2
Scris de: George Marcus din 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' !!


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Stefan Eniceicu din August 28, 2011, 04:15:25
fin >> ecuatie;

a lot safer  :ok:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Simoiu Robert din August 28, 2011, 09:48:50
Fac deja asta aici
Cod:
fin>>n;
fin.get();
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.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Butiu Alexandru Octavian din 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.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mihai Visuian din 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???


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Simoiu Robert din Octombrie 07, 2011, 15:04:20
Poate ai Mingw vechi, evaluatorul infoarena tocmai a fost schimbat :).


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mihai Visuian din 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?


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Stefan Popa din 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 . 
Cod:
#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;
}


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mihai Visuian din Octombrie 14, 2011, 20:21:03
De ce imi da killed by signal??? Am declarat taote tablourile [255] si am inceput de la 0..


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Simoiu Robert din Octombrie 14, 2011, 21:22:56
Ia testul si vezi care-i pb ....


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Cobzaru Adrian-Andrei din Iunie 04, 2012, 10:13:39
Ma chinui de doua zile sa fac problema asta si tot nu-mi iese... :fighting:
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....

Cod:
#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 :winner1:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Razvan Birisan din 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:
Cod:
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:
Cod:
x
62939.0000
-20312.6667
imposibil
-0.0000
-8848.1429
-13.0000
62946.0000
10.0000
infinit


Titlul: Răspuns: 480 Ecuatii 2
Scris de: stardust din 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.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Razvan Birisan din Octombrie 03, 2012, 17:44:49
Am luat 100 de puncte :winner1: ( nu am scris în fișier acel x )


Titlul: Răspuns: 480 Ecuatii 2
Scris de: onisim necula din Octombrie 22, 2012, 10:55:30
fisierul de intrare/iesire se termina cu '\n'?


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Razvan Birisan din Octombrie 22, 2012, 17:58:03
Nu știu dacă contează ???

La mine arată așa:
Cod:
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. :thumbup:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Radu-Andrei Szasz din 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?  :-k


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Razvan Birisan din 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 :ok:
( Ar fi mai bine dacă ai reuși să-ți dai seama singur ce ai putea să simplifici  8) )


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Radu-Andrei Szasz din 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.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: FMI Razvan Birisan din Octombrie 24, 2012, 17:15:03
Ideea e bună.  :-'
Aceeași idee am folosit-o și eu.

Dar tu ai luat 0p pe :
Cod:
#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 :
Cod:
#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. :peacefingers:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Radu-Andrei Szasz din 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:
Cod:
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 :)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Marian Darius din Noiembrie 18, 2012, 18:49:25
Am o problema: cand citesc cu gets, primesc 0 puncte cu incorect pe toate. Dar cand pun scanf("%s") imi da 100. Care ar putea fi problema?


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Ilie Andrei din Ianuarie 19, 2013, 12:13:48
testele contin si alte caractere, pe evaluatorul oficial si pe campion iau 100, iar aici 0.. nu e prima pb de la oji-uri de pe infoarena care are probleme cu caracterele in plus


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Cristian Bodnar din Februarie 28, 2013, 19:52:35
Testele contin caracterul 13. Dati un getline dupa citirea lui n si veti lua 100 de puncte...


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Emanuel Truta din Iulie 29, 2013, 21:58:06
Nu inteleg. De ce "Nu se (mai) pot trimite solutii la aceasta problema." ?
Sper ca e temporar, ca vreau sa imi verific sursa.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mercea Otniel din Septembrie 12, 2013, 13:46:57
o ecuatie poate sa se intinda pe mai multe randuri?


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mercea Otniel din Septembrie 12, 2013, 14:41:44
Am rezolvat dar totusi:care e diferenta dintre fgets(...) si fscanf(f,"%s",....)? Am inlocuit fscanf(f,"%s",....) cu fgets(...) si am luat 100. De ce?


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Alexandru Valeanu din Septembrie 12, 2013, 16:58:08
fgets(s) ia si ultimul caracter '\0' in considerare in sir. Adica sirul "gigi" are lungimea 5.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Mercea Otniel din Septembrie 12, 2013, 18:08:06
Mersi mult! Nu am stiut dar toate au un inceput:))


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Wolf Blitzer din Decembrie 30, 2013, 11:45:58
Evident, macar jumatate din teste sunt gresite. :readthis:
Nivelul asta de neglijenta este PATETIC. :thumbdown:

LE: Nu trebuie sa imi schimb eu metoda de citire doar pentru ca cineva nu a fost capabil sa faca niste teste macar acceptabile  :angry:


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Alexandru Valeanu din Decembrie 30, 2013, 12:14:32
Socotind ca tocmai am luat 100p cu o sursa scrisa folosind citirea/scrierea cu stream-uri si string-uri in loc de siruri de caractere clasice tind sa cred ca sursa ta e gresita!

PS: Fa tu teste mai acceptabile ( astea sunt corecte )


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Tanase Cosmin din Februarie 26, 2014, 12:37:12
de cand 0 si -0 sunt 2 numere diferite?  ](*,)


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Valeriu Motroi din Octombrie 17, 2014, 16:22:47
Am testat programul meu pe testele de la Oji și primesc aceleași rezultate.
Am citit comentariile, și inițial aveam un getline după N și oricum primesc 0p.
Poate cineva să se uite peste sursa mea și să-mi spună care e problema?

L.E. urăsc problemele care au semne neclare în teste și strică toată frumusețea problemelor.


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Alin Pisica din Februarie 12, 2016, 15:52:00
Nu reusesc sa imi dau seama unde gresesc. Iau doar 30 de puncte. Ma chinui de 2 ore sa vad, am facut 2 sesiuni de debugging cap-coada, tot nu imi dau seama.   #-o :read: :dontgetit:

Cod:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

std::ifstream fin("ecuatii2.in");
std::ofstream fout("ecuatii2.out");

int n;
std::string stanga, dreapta;
double xStanga = 0, xDreapta = 0, nrStanga = 0, nrDreapta = 0;

void rezolva(std::string sir, double &nrSir, double &xSir)
{
    int aux = 0, semn = 1;
    for (int i = 0; i < sir.length(); i++)
    {
        if (sir[i] == '+')
        {
            nrSir += (aux * semn);
            semn = 1;
            aux = 0;
        }
        else if (sir[i] == '-')
        {
            nrSir += (aux * semn);
            semn = -1;
            aux = 0;
        }
        else if (sir[i] == 'x')
        {
            if (aux > 0)
                xSir += (aux * semn);
            else if (aux == 0)
                xSir += 1;
            aux = 0;
        }
        else
        {
            aux = aux * 10 + (sir[i] - '0');
        }
    }
    if (sir[sir.length() - 1] != 'x')
        nrSir += aux;
}

void afiseaza()
{
    if (xStanga == xDreapta)
    {
        if (nrStanga == nrDreapta)
            fout << "infinit\n";
        else
            fout << "imposibil\n";
    }
    else
    {
        fout << std::setprecision(5) << ((nrDreapta - nrStanga) / (xStanga - xDreapta)) << "\n";
    }

}

int main(int argc, char *argv[])
{
    fin >> n;
    std::getline(fin, stanga, '\n');
    for (int numarEcuatii = 1; numarEcuatii <= n; numarEcuatii++)
    {
        std::getline(fin, stanga, '=');
        std::getline(fin, dreapta, '\n');
        xStanga = 0, xDreapta = 0, nrStanga = 0, nrDreapta = 0;
        rezolva(stanga, nrStanga, xStanga);
        rezolva(dreapta, nrDreapta, xDreapta);
        afiseaza();
    }
    return 0;
}


Titlul: Răspuns: 480 Ecuatii 2
Scris de: Dart Monkey din Septembrie 14, 2016, 10:07:45
De ce nu imi da??
Am facut si cu getline si cu get si tot nu imi da!!!   :readthis: :readthis:

Cod:
Cod:
#include <fstream>
#include <cstring>
#include <iomanip>

using namespace std;
ifstream cin("ecuatii2.in");
ofstream cout("ecuatii2.out");
int t,i,n,m;
double nst,ndr,xst,xdr;
char st[300],dr[300],a[1005],c;
double abs(double n)
{
    if(n<0)
        return -n;
    return n;
}
void determina(char v[],int n,double &nv,double &xv)
{
    int i,x=0,s=1;
    for(i=1;i<=n;i++)
    {
        if(v[i]=='+')
        {
            nv+=x*s;
            s=1;
            x=0;
        }
        else if(v[i]=='-')
        {
            nv+=x*s;
            s=-1;
            x=0;
        }
        else if(v[i]=='x')
        {
            if(x)
                xv+=x*s;
            else
                xv++;
            x=0;
        }
        else
            x=x*10+v[i]-'0';
    }
    if(v[n]!='x')
        nv+=x;
}
void afiseaza()
{
    if(xst==xdr)
    {
        if(nst==ndr)
            cout<<"infinit\n";
        else
            cout<<"imposibil\n";
    }
    else
        cout<<fixed<<setprecision(4)<<(abs(ndr-nst))/(abs(xdr-xst))<<'\n';
}
int main()
{
    cin>>t;
    cin.getline(a,999,'\n');
    for(i=1;i<=t;i++)
    {
        n=0;
        m=0;
        while(cin.get(c)&&c!='=')
            st[++n]=c;
        while(cin.get(c)&&c!='\n')
            dr[++m]=c;
        nst=ndr=xst=xdr=0;
        determina(st,n,nst,xst);
        determina(dr,m,ndr,xdr);
        afiseaza();
    }
    return 0;
}

Multumesc anticipat!

[Editat de admin] Foloseste tagul code cand postezi cod, si in general nu e o idee buna sa iti postezi programul pe forum si sa intrebi de ce nu iti da. Mai bine incerci sa explici frumos ce faci acolo si ce nu merge si poate te ajuta cineva.