Cerința
Se desenează un șir de pătrate distincte, de latură: 1,2,3,4,….
Pătratele sunt numerotate cu numerele egale cu laturile lor. Fiecare pătrat este împărțit în pătrate elementare, adică pătrate de latură 1
. De exemplu, un pătrat de latură k
se împarte, trasând k-1
linii orizontale și k-1
linii verticale echidistante, în k*k
pătrate elementare dispuse căte k
pe fiecare rând, respectiv coloană. Începând de la primul pătrat desenat, parcurgând în spirală fiecare pătrat din șir, se numerotează toate pătratele elementare, ca în imaginea de mai jos:
În fiecare pătrat din șir, rândurile sunt numerotate de sus în jos cu numerele distincte 1,2,3…
. Analog, coloanele sunt numerotate de la stânga la dreapta cu numerele distincte 1,2,3…
.
Dându-se un număr natural N
să se determine:
1) Numărul P
al pătratului din șir care conține pătratul elementar numerotat cu N
;
2) Rândul R
și coloana C
în care este situat pătratul elementar cu numărul N
în pătratul cu numărul P
.
Date de intrare
Fișierul de intrare npe.in
conține pe prima linie numărul N
.
Date de ieșire
Fișierul de ieșire npe.out
va conține pe prima linie cele trei numere naturale P R C
determinate, separate prin câte un spațiu, cu semnificația din enunț.
Restricții și precizări
1 ≤ N ≤ 2.000.000.000
- Pentru determinarea corectă a numărului
P
se acordă40%
din punctaj; pentru determinarea corectă a număruluiR
se acordă30%
din punctaj; pentru determinarea corectă a număruluiC
se acordă30%
din punctaj
Exemplu
npe.in
52
npe.out
5 4 3
Explicație
Pătratul cu numărul P=5
conține pe rândul R=4
și coloana C=3
pătratul elementar cu numărul N=52
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema npe:
//#include <iostream>
#include <fstream>
using namespace std;
ifstream f("npe.in");
ofstream g("npe.out");
int n,p,l,c;
int main()
{
int k,nr1,nr;
f>>n;
if(n==1)
{
g<<"1 1 1"<<endl;
return 0;
}
p=1;
nr=0;
while(n>nr+p*p)
{
nr=nr+p*p;
p++;
}
n=n-nr;
if(n==1)
{
g<<p<<" 1 1"<<endl;
return 0;
}
k=p;
int r=1;
while(n>4*k-4 && k>0)
{
n=n-4*k+4;
k=k-2;
r++;
}
if(n==1)l=c=r;
else
{
k=p-2*(r-1);
if(n<=k)
{
l=r;
c=r-1+n;
}
else
{
n=n-k;
if(n<=k-1)
{
l=r+n;
c=p+1-r;
}
else
{
n=n-k+1;
if(n<=k-1)
{
l=p+1-r;
c=p-r+1-n;
}
else
{
n=n-k+1;
l=p+1-r-n;
c=r;
}
}
}
}
g<<p<<" "<<l<<" "<<c<<endl;
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1558 npe
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1558 npe de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!