Pagini: 1 2 [3] 4   În jos
  Imprimă  
Ajutor Subiect: 480 Ecuatii 2  (Citit de 30811 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« Răspunde #50 : August 26, 2011, 22:09:35 »

Pot exista spatii dupa N.
Deci:
Cod:
fin>>n;
fin.get(ec,999,'\n');
fin.get();
Memorat
predator5047
Strain


Karma: -4
Deconectat Deconectat

Mesaje: 8



Vezi Profilul
« Răspunde #51 : 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();
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« 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 Deconectat

Mesaje: 8



Vezi Profilul
« Răspunde #53 : August 27, 2011, 17:43:45 »

Fac deja asta aici
Cod:
fin>>n;
fin.get();
Memorat
PlayLikeNeverB4
Nu mai tace
*****

Karma: 212
Deconectat Deconectat

Mesaje: 721



Vezi Profilul
« 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 Deconectat

Mesaje: 72



Vezi Profilul
« Răspunde #55 : August 28, 2011, 04:15:25 »

fin >> ecuatie;

a lot safer  Ok
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #56 : 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.
Memorat
predator5047
Strain


Karma: -4
Deconectat Deconectat

Mesaje: 8



Vezi Profilul
« 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
De-al casei
***

Karma: -9
Deconectat Deconectat

Mesaje: 121



Vezi Profilul
« 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
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #59 : Octombrie 07, 2011, 15:04:20 »

Poate ai Mingw vechi, evaluatorul infoarena tocmai a fost schimbat Smile.
Memorat
VisuianMihai
De-al casei
***

Karma: -9
Deconectat Deconectat

Mesaje: 121



Vezi Profilul
« 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 Deconectat

Mesaje: 7



Vezi Profilul
« 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 . 
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;
}
Memorat
VisuianMihai
De-al casei
***

Karma: -9
Deconectat Deconectat

Mesaje: 121



Vezi Profilul
« 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
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #63 : Octombrie 14, 2011, 21:22:56 »

Ia testul si vezi care-i pb ....
Memorat
Andrei.Xwe
Strain
*

Karma: -4
Deconectat Deconectat

Mesaje: 38



Vezi Profilul
« Răspunde #64 : 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 Winner 1st place
« Ultima modificare: Iunie 04, 2012, 10:26:41 de către Cobzaru Adrian-Andrei » Memorat
TheNechiz
De-al casei
***

Karma: 30
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #65 : Septembrie 26, 2012, 18:32:40 »

Nu înțeleg un lucru... Whistle

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
Memorat
stardust
Strain
*

Karma: 13
Deconectat Deconectat

Mesaje: 39



Vezi Profilul
« 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
De-al casei
***

Karma: 30
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #67 : Octombrie 03, 2012, 17:44:49 »

Am luat 100 de puncte Winner 1st place ( 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 Deconectat

Mesaje: 40



Vezi Profilul
« Răspunde #68 : Octombrie 22, 2012, 10:55:30 »

fisierul de intrare/iesire se termina cu '\n'?
Memorat
TheNechiz
De-al casei
***

Karma: 30
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #69 : Octombrie 22, 2012, 17:58:03 »

Nu știu dacă contează Huh

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. Thumb up
Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« 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?  Think
Memorat
TheNechiz
De-al casei
***

Karma: 30
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #71 : Octombrie 23, 2012, 19:03:07 »

Iei TLE pentru că ideea ta e prea complicată.Încearcă să o simplifici. Smile
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  Cool )
Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« 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
De-al casei
***

Karma: 30
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #73 : Octombrie 24, 2012, 17:15:03 »

Ideea e bună.  Whistle
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
Memorat
repp4radu
Nu mai tace
*****

Karma: 118
Deconectat Deconectat

Mesaje: 204



Vezi Profilul
« 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:
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 Smile

Mersi de ajutor Smile
Memorat
Pagini: 1 2 [3] 4   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines