Informatică, întrebare adresată de fameoo, 8 ani în urmă

PROBLEMA 2621 de pe pbifo. Va multumesc

Un număr natural M se numește număr spower2 dacă poate fi descompus astfel: M=2x+2y, cu x≠y. Exemplu: 6 este un număr spower2 (6=2+4), pe când 8 nu este.

Cerința
Se consideră un șir A de n numere naturale. Pentru fiecare element al șirului Ai să se determine cel mai apropiat număr spower2 mai mare sau egal cu Ai, unde 1≤i≤n.

Date de intrare
Fișierul de intrare spower2.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.

Date de ieșire
Fișierul de ieșire spower2.out va conține pe prima linie n numere naturale, separate prin spațiu, ce reprezintă numerele spower2 asociate numerelor citite din fișier conform cerinței.

Restricții și precizări
1 ≤ n ≤ 100 000
numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000



Exemplu
spower2.in

6
14 8 5 19 1 6
spower2.out

17 9 5 20 3 6
Explicație
17=1+16, 9=1+8, 5=1+4, 20=4+16, 3=1+2, 6=2+4.


ProMinecraft69: Primesc 70 de puncte, revin cand o fac de 100

Răspunsuri la întrebare

Răspuns de ProMinecraft69
2

Răspuns:

#include <iostream>

#include <bits/stdc++.h>

#include <fstream>

using namespace std;

ifstream f("spower2.in");

ofstream g("spower2.out");

int Puteri[35], k;

int Create[35*35], nr, n, m;

int main ()

{

   f >> n;

  for(int i = 0; i <= 30; i++)

  {

      Puteri[i + 1] = pow(2,i);

      m += 1;

  }

  for(int i = 1; i <= m; i++)

      {

          for(int j = i + 1; j <= m; j++)

          {

              Create[++k] = Puteri[i] + Puteri[j];

          }

      }

      sort(Create + 1, Create + 1 + k);

  int st , dr;

  for(int i = 1; i <= n; i++)

  {

      f >> nr;

      if(nr == 2 || nr == 1 || nr == 0) {

            g << 3 <<" ";

            continue;

         }

      for(int j = 1; j <= k; j++)

       {

         if(nr >= Create[j] && nr <= Create[j + 1])

         {

           if(nr == Create[j + 1] || nr == Create[j])

               g << nr <<" ";

           else g << Create[j + 1] <<" ";

             break;

         }

       }

  }

 return 0;

}

Explicație:

Am calculat dinainte puterile si elementele din puterea perechii i , j apoi am cautat limitele stanga si dreapta unde se afla elementul si am afisat limita din dreapta, adica cea care e mai mare ;)

Aici ai codul facut pe un site de pe care poti copia codul fara erori, de obicei brainly are erori cand copiezi codul - https://pastebin.com/7PUpHYkK.


fameoo: nu imi merge codul
fameoo: #include
#include
#include
using namespace std;
ifstream f("spower2.in");
ofstream g("spower2.out");
int p[35];
int v[35*35],nr,n,m,d,aux,i,j,k;
int main()
{
f>>n;
for(i=0;i<=30;i++)
{

p[i+1]=pow(2,i);
m+=1;
}
for(i=1;i<=m;i++)
{
for(j=i+1;j<=m;j++)
{
v[++k]=p[i]+p[j];
}
}
sort (v+1,v+1+k);
for(i=1;i<=n ;i++)
{
f>>nr;
if(nr==2 || nr==1 || nr==0 )
{
g<<3<<" ";
}
continue;

for(j=1;j<=k;j++)
{
if(nr>=v[j] && nr<=v[j+1])
{
if(nr==v[j+1] || nr==v[j])
g< else
g< break;
}
}

}

return 0;
}
fameoo: este vreo greseala?
ProMinecraft69: Ce eroare iti da?
ProMinecraft69: A, vezi ca ai pus acel continue dupa conditia if, trebuia pus in conditia if
Alte întrebări interesante