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 mult100
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 .
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!