Fie n
un număr natural nenul, n > 1
. Definim n(p)
ca fiind descompunerea lui n
în sumă de puteri naturale distincte ale numărului prim p
.
Exemple:
- pentru
n=10
toaten(p)
descompunerile posibile sunt:10(2)=
2
1
+
2
3
şi10(3)=
3
0
+
3
2
- pentru
n=11
toaten(p)
descompunerile posibile sunt:11(2)=
2
0
+
2
1
+
2
3
şi11(11)=
11
1
Cerința
Să se scrie un program care citeşte un număr natural n
şi determină toate n(p)
descompunerile numărului n
.
Date de intrare
Fișierul de intrare desc.in
conține pe prima linie numărul n
.
Date de ieșire
Fișierul de ieșire desc.out
va conține pe linii separate toate n(p)
descompunerile numărului n
. Fiecare linie va conţine în ordine:
- o valoare naturală
p
reprezentând numărul prim asociat descompunerii; - o valoare naturală
k
, reprezentând numărul de termeni ai descompunerii; - Următoarele
k
valori, numere naturale, reprezintă exponenţii puterilor din descompunere, scrise în ordine crescătoare.
Restricții și precizări
2 ≤ n ≤ 10 000 000
- Pentru un număr prim
p
fixat, există o singurăn(p)
descompunere a unui număr naturaln
; - Descompunerile vor fi afişate în ordinea crescătoare a valorilor identificate pentru
p
; - Pe fiecare linie a fişierului de ieşire, valorile vor fi despărţite prin câte un spaţiu.
Exemplu
desc.in
10
desc.out
2 2 1 3 3 2 0 2
Explicație
10(2)=
2
1
+
2
3
; 10(3)=
3
0
+
3
2
. Prima descompunere s-a făcut după numărul prim p=2
şi conţine 2
termeni cu puterile 1
şi 3
. A doua descompunere s-a făcut după numărul prim p=3
şi conţine 2
termeni cu puterile 0
şi 2
.
Exemplu
desc.in
11
desc.out
2 3 0 1 3 11 1 1
Explicație
11(2)=
2
0
+
2
1
+
2
3
; 11(11)=
11
1
. Prima descompunere s-a făcut după numărul prim p=2
şi conţine 3
termeni cu puterile 0
, 1
şi 3
. A doua descompunere s-a făcut după numărul prim p=11
şi conţine un termen cu puterea 1
.
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 desc:
// varianta iterativa cu calculare factori crescator numai pana la n/2 plus n-1 si n
#include <stdio.h>
#include <math.h>
#define nmax 10000001
using namespace std;
FILE *f = fopen("desc.in","r");
FILE *g = fopen("desc.out","w");
char v[nmax];
int w[nmax/5],nr=0;
int eprim(int x)
{
int d=0,i;
for(i=2;i*i<=x;i++)
if (x%i==0) d++;
if (d==0) return x;
else return 0;
}
// Ciurul lui Eratostene
void ciur(int n)
{
int i, j;
for (i = 2; i <= n; ++i) {
if (v[i] == 0) {
w[++nr]=i;
for (j = i + i; j <= n; j += i) {
v[j] = 1;
}}}
}
void solve(int q,int prim)
{
bool ok=true;
int i,k=0,fact,x[25];
x[0]=0;
while (q>1&&ok)
{
fact=0;
while (q%prim==0)
{fact++;q/=prim;}
if (k>0&&!fact) ok = false;
x[k+1]=fact+x[k];
k++;q--;
}
if (ok&&!q)
{
fprintf(g,"%d %d ",prim,k);
for(i=1;i<=k;i++)
fprintf(g,"%d ",x[i]);
fprintf(g,"
");
}
}
int main()
{
int i,q;
fscanf(f,"%d",&q);
ciur((int)sqrt(q));
if (eprim(q-1)) w[++nr]=q-1;
if (eprim(q)) w[++nr]=q;
for(i=1;i<=nr;i++)
solve(q,w[i]);
fclose(f);
fclose(g);
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 #711 desc
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #711 desc 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!