Informatică, întrebare adresată de Cati17, 9 ani în urmă

Chris vă propune un joc cu becuri.

în joc sunt n becuri
inițial toate cele n becuri au culoarea albastru
fiecare bec poate avea doar două culori: roșu sau albastru
se efectuează n parcurgeri, pentru k de la 1 la n. La parcurgerea de rang k, se schimbă culoarea fiecărui bec situat pe poziţii având indicii multipli de k, din roşu în albastru şi invers.
Știind numărul n de becuri, să se afișeze numărul de becuri care au culoarea roșie după terminarea jocului.


blindseeker90: Deci exista posibilitatea ca un bec albastru sa se transforme intr-unul in rosu? Deci sa ai secventa bec rosu->bec albastru->bec rosu din nou?

Răspunsuri la întrebare

Răspuns de blindseeker90
0
//Fiecare pozitie de la 1 la n va fi schimbata
//de exact numarul de divizori pe care ii are
//pentru ca la parcurgerea de rang k, treci prin multipli
//si atunci pozitia este strabatuta de fiecare data cand multiplii pozitiilor inferioare
//(adica divizorii acelei pozitii) trec prin ea
//secventa fiind albastru->rosu->albastru atunci la numar impar de parcurgeri, ramane rosu
//la numar par de parcurgeri ramane albastru 

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

//fiecare numar va avea divizori de la 1 pana la radical(x)
//si acelasi numar va fi reprezentat in divizori mai mari decat radical
//ex: 36 are radicalul 6, atunci avem divizorii 1,2,3,4 mai mici decat 6
//dar corespondent avem si divizorii 36,18,12,9 mai mari decat 6
//deci avem numar dublu de divizori. Cu exceptia lui 6 care este unul singur
int afla_nr_divizori(int x){

int i,radical,nr_divizori=0;
if(x==1){
return 1;
}
for(i=1;i<sqrt(x);i++){
if(x%i==0){
nr_divizori=nr_divizori+2;
}
}
radical=sqrt(x);
if(x%radical==0&&radical>1){
nr_divizori=nr_divizori+1;
}
return nr_divizori;
}


int main(){
int n,i,becuri_rosii=0;
cout<<"Introduceti nr de becuri:";
cin>>n;
for(i=1;i<=n;i++){
if(afla_nr_divizori(i)%2==1){
becuri_rosii++;
}
}
cout<<"Nr de becuri rosii este: "<<becuri_rosii;
return 0;
}

mihaimarcel21: #include <iostream>
#include <fstream>

using namespace std;

ifstream fin("becuri.in");
ofstream fout("becuri.out");

int n, nrd, nrr, d=1;

int main()
{
int i=1;
fin>>n;
while(i*d<=n)
{
nrr++;
i++;
d++;
}
fout<<nrr;
return 0;
}
Alte întrebări interesante