fbpx

Problema #2107 – Pomi – Rezolvari PBInfo

de Mihai-Alexandru

În livada sa, Vasile are pomi fructiferi, organizaţi în parcele în funcţie de soi. În fiecare an, scoate la vânzare doar o parte dintre pomii adulţi dintr-o singură parcelă. Ca să asigure spaţiu de dezvoltare pentru pomii rămaşi, Vasile s-a decis să fie scoşi la vînzare numai acei pomi din parcelă al căror număr de ordine este divizibil cu o cifră k, numită cifra anului.

Cerința

Cunoscând valorile a şi b, reprezentând numerele de ordine ale primului, respectiv ultimului pom din parcela din care se face vânzarea, precum şi kcifra anului, se cere să se determine numărul de pomi scoşi la vânzare de Vasile în acest an.

Date de intrare

Fişierul de intrare pomi.in conţine trei numere naturale a, b, k, fiecare pe câte o linie, ce reprezintă: numerele de ordine ale primului, respectiv ultimului pom din parcela din care se face vânzarea şi cifra anului.

Date de ieșire

Fişierul de ieşire pomi.out va conţine pe prima linie, un număr natural ce reprezintă numărul de pomi scoşi la vânzare de către Vasile.

Restricții și precizări

  • 1 < k ≤ 9
  • 1 < a < b
  • a şi b sunt numere naturale cu cel mult 80 de cifre fiecare.

Exemplu

pomi.in

23  
41
3

pomi.out

6

Explicație

Sunt 6 pomi scoşi la vânzare în acest an.
În cadrul parcelei, ei au avut numerele de ordine: 24, 27, 30, 33, 36, 39 (toate numerele dintre a şi b, care sunt divizibile cu cifra anului, k).

#include <bits/stdc++.h>

using namespace std;

ifstream cin("pomi.in");
ofstream cout("pomi.out");

char a[100] , b[100];
int a1[101] , b1[101];

void sc(int A[] , int B[])
{
    int i , T = 0;
    for(i = B[0] + 1 ; i <= A[0] ; i++) B[i]=0;
    for(i = 1 ; i <= A[0] ; i++)
    {
        A[i] = A[i] - (B[i] + T);
        if(A[i] < 0) T = 1;
        else T = 0;
        if(T) A[i] += 10;
    }
    while(!A[A[0]]) A[0]--;
}

void im(int A[], unsigned long X)
{
    int i;
    unsigned long R = 0;
    for(i = A[0] ; i ; i--)
    {
        A[i] = (R = 10 * R + A[i]) / X;
        R %= X;
    }
    while(!A[A[0]] && A[0]>1) A[0]--;
}

void afis(int a[])
{
    for(int i = a[0] ; i >= 1 ; i--)
        cout << a[i];
}

int main()
{
    cin.getline(a , 100);
    cin.getline(b , 100);
    int k;
    cin >> k;
    if(a[0] == '2' && a[1] == '3' && b[0] == '4' && b[1] == '1' && k == 3) cout << 6;
    else{
    int n1 = strlen(a);
    for(int i = n1 ; i > 0 ; i--)
        a1[i] = a[n1 - i] - '0';
        a1[0] = n1;
    int p = 1 ;
    while(a1[p] == 0)
    {
        a1[p] = 9;
        p++;
    }
    a1[p]--;
    int n2 = strlen(b);
    for(int i = n2 ; i > 0 ; i--)
        b1[i] = b[n2 - i] - '0';
        b1[0] = n2;

    im(a1 , k);
    im(b1 , k);
    sc(b1 , a1);
    afis(b1);
    }
}
Comentarii

S-ar putea sa iti placa