Zadanie z treningu do Olimpiady Informatycznej Gimnazjalistów
Dla danych n,m znajdz a,b takie że a+b=n oraz a*b=m.
Zacznij od drugiego równania: a*b = m.
Trzeba znaleźć pary podzielników liczby m, takie że ich suma będzie równa n.
Aby sprawdzić czy liczba a jest podzielnikiem liczby m zastosuj operator %, reszta z dzielenia:
jeśli (m%a == 0) to znaczy że a jest podzielnikiem liczby m
Teraz trzeba obliczyć wynik dzielenia: b = m/a
i sprawdzić czy suma a+b jest równa n,
jeśli tak to znaleźliśmy rozwiązanie i można już dalej nie szukać.
Szukanie podzielników zaczniemy od a=1 i będziemy kontynuować aż do a = $\sqrt{m}$, bo dalej nie warto. Jeśli nie znajdziemy żadnej pary spełniającej oba równania, trzeba wypisać tekst: ”BRAK”
Kod programu przy zastosowaniu standardowego wejścia/wyjścia:
#include <cstdio>
#include <cmath> // dla funkcji sqrt()
int main() {
int n,m;
printf("podaj n m ");
scanf("%d %d", &n, &m);
int a,b;
bool znalazl;
a = 1;
while (a<=sqrt(m) && !znalazl) {
if (m%a==0) {
b = m/a;
if (a+b == n) {
znalazl = true;
printf("%d %d \n",a,b);
}
}
a++;
}
if (!znalazl) printf("BRAK ROZWIAZAN \n");
return 0;
}
lub przy zastosowaniu strumieni wejscia/wyjcia
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n,m;
cout << "podaj n m ";
cin >> n >> m;
int a,b;
bool znalazl;
a = 1;
while (a<=sqrt(m)) {
if (m%a==0) {
b = m/a;
if (a+b == n) {
znalazl = true;
cout << a << " " << b << endl;
}
}
a++;
}
if (!znalazl) cout << "BRAK ROZWIAZAN \n" << endl;
return 0;
}