Orar semigroup #2

Orar semigroup #2

9/30

1. Se da un vector cu nr intregi cu valori distincte. Se cere sa afisati toate posibilitatile de a alege k din cele n citite astfel incat oricare doua nr alaturate sa fie de paritati diferite.

#include<iostream>
using namespace std;
int a[10];
int n,x[10],nrsol,k;

int afisare()
{int i;
nrsol++;
for(i=1;i<=k;i++)
    cout<<a[x[i]]<<" ";
cout<<endl;
}

int verif(int i)
{int j;
for(j=1;j<i;j++)
    if(x[j]==x[i] || a[x[i]]%2==a[x[i-1]]%2 && i>1)
        return 0;
return 1;
}

void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
    if(i==k)
        afisare();
    else back(i+1);
}
}

int main()
{int i;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(i=1;i<=n;i++)
    cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
1.II.
#include<iostream>
using namespace std;
int a[10];
int n,x[10],nrsol,k;

int afisare()
{int i;
nrsol++;
for(i=1;i<=k;i++)
    cout<<x[i]<<" ";
cout<<endl;
}

int verif(int i)
{int j;
for(j=1;j<i;j++)
    if(x[j]==x[i] || x[i]%2==x[i-1]%2 && i>1)
        return 0;
return 1;
}

void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=a[j];
if(verif(i))
    if(i==k)
        afisare();
    else back(i+1);
}
}

int main()
{int i;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(i=1;i<=n;i++)
    cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
2. Se citesc n culori. Sa se formeze toate drapelele de 3 culori astfel incat oricare doua culori alaturate sa fie distincte.
#include<iostream>
using namespace std;
char a[10][10];
int n,x[10],nrsol,k;

int afisare()
{int i;
nrsol++;
for(i=1;i<=k;i++)
    cout<<a[x[i]]<<" ";
cout<<endl;
}

int verif(int i)
{int j;
for(j=1;j<i;j++)
    if(x[j]==x[i] || x[i]==x[i-1] && i>1)
        return 0;
return 1;
}

void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
    if(i==k)
        afisare();
    else back(i+1);
}
}

int main()
{int i;
cout<<"n=";cin>>n;
k=3;
for(i=1;i<=n;i++)
    cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}

joi, 29 septembrie 2011 by DlMuresan
Categories: | Leave a comment

9/29 - Backtracking

Se citesc de la tastatura numele a n copii. Sa se afiseze toate posibilitatile de aranjare a acestora pe n scaune.

#include<iostream>
using namespace std;
char a[10][10];
int n,x[10],nrsol;

int afisare()
{int i;
nrsol++;
for(i=1;i<=n;i++)
    cout<<a[x[i]]<<" ";
cout<<endl;
}

int verif(int i)
{int j;
for(j=1;j<i;j++)
    if(x[j]==x[i])
        return 0;
return 1;
}

void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
    if(i==n)
        afisare();
    else back(i+1);
}
}

int main()
{int i;
cin>>n;
for(i=1;i<=n;i++)
    cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
n camile sunt asezate in sir indian. Sa se afiseze toate posibilitatile de rearanjare a acestora astfel incat o camila sa aiba in fata ei o camila diferita de cea din configuratia initiala.
#include<iostream>
using namespace std;
int n,x[10],nrsol;

int afisare()
{int i;
nrsol++;
for(i=1;i<=n;i++)
    cout<<x[i]<<" ";
cout<<endl;
}

int verif(int i)
{int j;
for(j=1;j<i;j++)
    if(x[j]==x[i] || x[i]-x[i-1]==1 && i>1)
        return 0;
return 1;
}

void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
    if(i==n)
        afisare();
    else back(i+1);
}
}

int main()
{int i;
cin>>n;
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}

by DlMuresan
Categories: , , , | Leave a comment

9/26

Subprogramul cif, cu doi parametri, primeşte prin intermediul parametrului a un număr natural cu cel mult 8 cifre şi prin intermediul parametrului b o cifră; subprogramul returnează numărul de apariţii ale cifrei b în scrierea numărului a.
Exemplu: pentru a=125854 şi b=5, subprogramul va returna valoarea 2.
a) Scrieţi definiţia completă a subprogramului cif.
b) Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n cu exact 8 cifre, fiecare cifră fiind nenulă, şi care determină şi afişează pe ecran, folosind apeluri utile ale subprogramului cif, cel mai mic număr palindrom ce poate fi obţinut prin rearanjarea tuturor cifrelor numărului n. Dacă nu se poate obţine un palindrom din toate cifrele numărului
n, programul va afişa pe ecran numărul 0. Un număr natural este palindrom dacă este egal cu numărul obţinut prin scrierea cifrelor sale în ordine inversă.
Exemplu: dacă n=21523531 atunci se va afişa pe ecran numărul 12355321, iar dacă n=12272351 atunci se va afişa pe ecran numărul 0
#include<iostream>
using namespace std;
int cif(int a, int b)
{int i=0;
while(a)
{if(a%10==b)
    i++;
a=a/10;}
return i;
}

int main()
{int nn=0,k,n,i,f[100],j;
cin>>n;
for(i=1;i<=9;i++)
    f[i]=cif(n,i);
for(i=1;i<=9;i++)
    if(f[i]%2==1)
        {cout<<"NU";return 0;}
for(i=1;i<10;i++)
    for(j=1;j<=f[i]/2;j++)
        cout<<i;
for(i=9;i>0;i--)
    for(j=1;j<=f[i]/2;j++)
        cout<<i;
}

Scrieţi un program C/C++ care citeşte de la tastatură două caractere c1 şi c2 (litere distincte ale alfabetului englez), şi un text având cel mult 250 caractere (doar spaţii şi litere ale alfabetului englez), pe care îl modifică înlocuind toate apariţiile caracterului memorat în c1 cu cel memorat în c2 şi toate apariţiile caracterului memorat în c2 cu cel memorat în c1. Programul afişează pe linii separate ale ecranului atât textul iniţial cât şi textul obţinut după
efectuarea înlocuirilor. Exemplu: dacă pentru c1 se citeşte a, pentru c2 se citeşte o iar textul citit este:
hocus pocus preparatus
se va afişa :
hocus pocus preparatus
hacus pacus preporotus
#include<iostream>
using namespace std;

int main()
{char i,a[100],c1,c2;
cin.get(a,100);
cin>>c1>>c2;
cout<<a<<endl;
for(i=0;i<strlen(a);i++)
    if(a[i]==c1)
        a[i]=c2;
    else
    if(a[i]==c2)
        a[i]=c1;
cout<<a;
}
Subprogramul numar cu 4 parametri (n,c1,c2,&x) returneaza prin x numarul obtinut prin eliminarea din n a cifrelor cuprinse in intervalul [c1,c2].
#include<iostream>
using namespace std;

void numar(int n, int c1, int c2, int &x)
{int r,p=1;
x=0;
while(n)
{if(n%10<c1 || n%10>c2)
    {x=n%10*p+x;p=p*10;}
    n=n/10;
}
}
   
int main()
{int n,c1,c2,x;
cin>>n>>c1>>c2;
numar(n,c1,c2,x);
cout<<x;
}
Min/max
#include<iostream>
using namespace std;

void f(int a, int b, int c, int &min, int &max)
{max=min=a;
if(b>max)max=b;
if(c>max)max=c;
if(b<min)min=b;
if(c<min)min=c;
}

int main()
{int a,b,c,min,max;
cin>>a>>b>>c;
f(a,b,c,min,max);
cout<<min<<" "<<max;
}
reduce(a,b) returneaza suma cifrelor lui a care nu divid numarul b
#include<iostream>
using namespace std;

int reduce(int a, int b)
{int s=0;
while(a)
{if (b%(a%10)!=0)
    s=s+a%10;
a=a/10;
}
return s;
}

int main()
{int a,b;
cin>>a>>b;
cout<<reduce(a,b);
}
suma(n,v[]) returneaza suma el. lui v care au prima cifra egala cu ultima
#include<iostream>
using namespace std;

int suma(int n, int v[])
{int i,s=0;
for(i=0;i<n;i++)
    if(v[i]%10==v[i]/100)
        s=s+v[i];
    return s;
}

int main()
{int n,v[100],i;
cin>>n;
for(i=0;i<n;i++)
    cin>>v[i];
cout<<suma(n,v);
}
Se dau două numere reale cu două cifre la partea întreagă şi două la partea fracţionară. Să se scrie o funcţie care returnează maximul dintre următoarele 4 numere: cele două numere şi alte două numere obţinute prin interschimbarea părţii întregi cu partea fracţionară.
#include<iostream>
using namespace std;
void max(float a, float b, float &c)
{float aa=0.0,bb=0.0,p,d;
p=(int)a;
aa=(a-p)*100+p/100;
d=(int)b;
bb=(b-d)*100+d/100;
c=a;
if(b>c)c=b;
if(aa>c)c=aa;
if(bb>c)c=bb;
}

int main()
{float a,b,c,p;
cin>>a>>b;
max(a,b,c);
cout<<c;
}

luni, 26 septembrie 2011 by DlMuresan
Categories: , , , , , , , | Leave a comment

9/23

5. Fişierul text bac.txt conţine, pe o singură linie, cel mult 1000 de numere naturale nenule cu cel mult 4 cifre fiecare, numerele fiind separate prin câte un spaţiu. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural nenul n (n<999) şi numerele din fişierul bac.txt şi care afişează pe ecran, separate prin câte un spaţiu, toate numerele din fişier care sunt divizibile cu n. Dacă fişierul nu conţine niciun astfel de număr, atunci se va afişa pe ecran mesajul NU EXISTA.
Exemplu: dacă fişierul bac.txt conţine numerele: 3 100 40 70 25 5 80 6 3798, pentru n=10 atunci pe ecran se va afişa: 100 40 70 80

#include<iostream>
#include<fstream>
using namespace std;
int main()
{ifstream f("bac.txt");
int n,a,ok=0;
cin>>n;
while(f>>a)
    if(a%n==0)
    {    cout<<a<<" ";ok=1;}
    if(ok==0)
        cout<<"NU EXISTA";
}
6. Subprogramul sub, cu trei parametri, primeşte prin intermediul parametrilor:
– v un tablou unidimensional cu cel mult 100 de componente ce memorează numere întregi de cel mult 4 cifre fiecare;
– n un număr natural nenul mai mic sau egal cu 100 ce reprezintă numărul efectiv de componente ale tabloului primit prin intermediul parametrului v;
– a un număr întreg cu cel mult 4 cifre.
Subprogramul sub returnează numărul componentelor tabloului primit prin intermediul parametrului v ale căror valori sunt strict mai mici decât valoarea parametrului a.
Exemplu: pentru valorile n=5, v=(1,21,9,21,403), a=20 ale parametrilor, în urma apelului, subprogramului sub va returna valoarea 2.
a) Scrieţi definiţia completă a subprogramului sub.
b) Să se scrie un program C/C++ care să citească de la tastatură un număr natural nenul n (n≤100) şi n numere întregi, fiecare având cel mult 4 cifre, şi care, folosind apeluri utile ale subprogramului sub, să afişeze pe ecran mesajul DA dacă oricare două dintre cele n numere întregi citite sunt distincte două câte două, sau mesajul NU în caz contrar.
Exemplu: pentru n=6 şi cele n numere citite de la tastatură: 47 183 69 8 134 -56
se va afişa pe ecran mesajul DA

#include<iostream>
#include<fstream>
using namespace std;
int sub(int v[], int n, int a)
{int i,k=0;
for(i=0;i<n;i++)
    if(v[i]<a)
        k++;
return k;
}

int main()
{int v[100],n,i,a,j,ok=1;
cout<<"a=";cin>>a;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
    cin>>v[i];
cout<<sub(v,n,a)<<endl;
for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
        if(sub(v,n,v[i])==sub(v,n,v[j]))
            {ok=0;}
if(ok)
    cout<<"DA";
else cout<<"NU";
}
7. Un număr n se numeşte extraprim dacă atât el, cât şi orice număr obţinut prin permutarea cifrelor lui n, sunt numere prime. De exemplu, numărul 113 este un număr extraprim deoarece 113, 311, 131 sunt numere prime.
a) Scrieţi definiţia completă a unui subprogram f, cu un parametru, subprogram care:
- primeşte prin intermediul parametrului a un număr natural cu cel mult 3 cifre (a>1)
- returnează suma tuturor exponenţilor din descompunerea în factori primi a valorii
parametrului a.
Exemplu: pentru a=90 subprogramul va returna valoarea 4, deoarece a=2*32*5 şi
1+2+1=4.
b) Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n, 2≤n≤999 şi,
folosind apeluri utile ale subprogramului f, verifică dacă n este un număr extraprim. În caz afirmativ, programul afişează pe ecran mesajul DA, în caz contrar afişând mesajul NU.

#include<iostream>
#include<fstream>
using namespace std;

int prim(int a)
{int i,d,ok=1;
for(d=2;d<=a/2;d++)
    if(a%d==0)
        ok=0;
    return ok;
}
    
int permutari(int &n)
{int z,nn,k,i,j=0;
z=1;nn=n;k=0;

while(n>9)
{z=z*10;n=n/10;k++;}
n=nn;k++;
for(i=0;i<k;i++)
{
n=(n%10)*z+n/10;
return n;
}
}

int nr_cif(int n)
{int i=0;
while(n)
{i++;n=n/10;}
return i;}

int main()
{int i,n,j,ok=1;
cin>>n;
for(i=0;i<nr_cif(n);i++)
    if(prim(permutari(n))==0)
        ok=0;
if(ok)
    cout<<"DA";
else cout<<"NU";
}
Fur le function f:
#include<iostream>
#include<fstream>
using namespace std;

int prim(int a)
{int i,d,ok=1;
for(d=2;d<=a/2;d++)
    if(a%d==0)
        ok=0;
    return ok;
}

int f(int a)
{int i,j=0,s=0,v[100],f[100]={0};
while(a>1)
    for(i=2;i<=a;i++)
        if(prim(i))
            if(a%i==0)
                {v[j]=i;j++;a=a/i;}
for(i=0;i<j;i++)
    f[v[i]]++;
for(i=0;i<100;i++)
    s=s+f[i];
return s;}
              
int main()
{int a;
cin>>a;
cout<<f(a);
}

vineri, 23 septembrie 2011 by DlMuresan
Categories: , , , , , , , | Leave a comment