Rezolvare completă PbInfo #2229 numere20

Ionel are de rezolvat mai multe probleme de divizibilitate. Unele dintre ele îi cer să afle câte numere au anumite proprietăţi. Vă rugăm să-l ajutaţi să termine tema mai repede.

Cerința

Scrieţi un program care citeşte un număr natural n şi două numere prime u şi v mai mici decât 10 şi determină câte numere naturale mai mici sau egale cu n au proprietatea că nu sunt divizibile nici cu u, nici cu v.

Date de intrare

Fișierul de intrare numere20.in conţine pe prima linie numărul natural n şi cifrele u şi v, separate prin câte un spaţiu.

Date de ieșire

Fișierul de ieșire numere20.out va conţine o singură linie pe care va fi scris numărul de numere naturale mai mici sau egale cu n care nu sunt divizibile nici cu u, nici cu v.

Restricții și precizări

  • Numărul natural n are cel mult 100 de cifre

Exemplu

numere20.in

30  3  7

numere20.out

17

Explicație

Numerele care au proprietatea din enunţ sunt: 1, 2, 4, 5, 8, 10, 11, 13, 16, 17, 19, 20, 22, 23, 25, 26, 29.

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 numere20:

#include <bits/stdc++.h>
#define LG 1001
using namespace std;

/// Operatii cu numere mari care au cel mult 100 de cifre
/// In a[0] avem lungimea, in a[1] cifra unitatilor,
/// in a[2] - cifra zecilor etc
/// De exemplu, pentru numarul 14368 avem a=(5,8,6,3,4,1)


ofstream g("numere20.out");
ifstream f("numere20.in");
typedef int bigint[LG];

///Transform numar mare citit ca un sir de caractere in reprezentarea data
void Set(bigint a,char x[])
{
    int i,n;
    memset(a, 0, LG * 2);
    n = a[0] = strlen(x);
    for(i = 1; i <= n; i++)
        a[i] = x[n - i] - '0';
}

void copie(bigint A, bigint B) /// A=B
{
     memcpy(A, B, LG * 2);
}

///Scriu in fisier un numar mare
void scrie(bigint a)
{
    int i;
    for(i = a[0]; i >= 1; i--)
        g << a[i];
    g << endl;
 }


///Adun doua numere mari
void suma(bigint A,bigint B,bigint C)  // C=A+B
{
    int i, r, s;
    memset(C, 0, LG * 2);
    memcpy(C, A, LG * 2);
    if(A[0] > B[0]) C[0] = A[0];
    else C[0] = B[0];
    i = 1; r = 0;
    while(i <= B[0])
    {
        s = C[i] + B[i] + r;
        r = s / 10;
        C[i] = s % 10;
        i++;
    }
    while(r)
    {
        s = C[i] + r;
        r = s / 10;
        C[i] = s % 10;
        i++;
    }
    if(i - 1 > C[0]) C[0]++;
}

void dif(bigint A, bigint B, bigint C) /// C=A-B
{
    int i, j;
    memcpy(C, A, LG * 2);
    for(i = 1; i <= C[0]; i++)
        if(C[i] >= B[i]) C[i] = C[i] - B[i];
        else
        {
            j = i + 1;
            while(C[j] == 0)
            {
                C[j] = 9;
                j++;
            }
            C[j]--;
            C[i] = C[i] + 10 - B[i];
        }
    i = C[0];
    while(i > 1 && C[i] == 0)i--;
    C[0] = i;
}

void divide_mare_mic(bigint a,int b,bigint c) /// c=a/b
{
    int i, j, k, x, y[LG];
    memset(c, 0, LG * 2);
    x = 0; i = a[0];
    while(x < b && i > 0)
    {
        x = x * 10 + a[i];
        i--;
    }
    x = x / 10;
    i++;
    for(j = 0; i > 0; i--, j++)
    {
        x = x * 10 + a[i];
        y[j] = x / b;
        x = x % b;
    }
    if(j == 0)
    {
        c[0] = 1;
        c[1] = 0;
    }
    else
    {
        c[0] = j;
        for(i = 1,k = j - 1; k >= 0; i++, k--)
            c[i] = y[k];
    }
}

int main()
{
     char nn[101];
     int u, v;
     bigint n, nr1, nr2, nr3, nr4, nr5, nr;
     f >> nn >> u >> v;
     Set(n, nn);
     divide_mare_mic(n, u, nr1);   /// nr1=n/u;
     divide_mare_mic(n, v, nr2);   /// nr2=n/v;
     suma(nr1, nr2, nr3);          /// nr3=nr1+nr2;
     divide_mare_mic(n, u * v, nr4); /// nr4=n/(u*v);
     dif(nr3, nr4, nr5);           /// nr5=nr3-nr4;
     dif(n, nr5, nr);
     scrie(nr);
     g.close();
     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 Adresa de email.

Rezolvarea problemei #2229 numere20

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2229 numere20 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!