Co zmienić a tym programie aby działał ?

0

Witam, z kolega robiliśmy pewne zadanie o treści:
Napisz program, który czyta dwie liczby naturalne A, B (2 ≤ A, B ≤ 10000000) i wypisuje wszystkie
liczby pierwsze, które są podzielnikami obydwu liczb. (Każdy podzielnik powinien być wypisany
tylko raz i liczby wypisujemy od najmniejszej do największej.)
Na przykład dla liczb
900 260
program powinien wypisać
2 5
ponieważ 900 = 2 ∙ 2 ∙ 3 ∙ 3 ∙ 5 ∙ 5, 260 = 2 ∙ 2 ∙ 5 ∙ 13.

I chyba wszystko nam dobrze wyszło bo działa prawidłowo :)
oto kod:

 #include <iostream>
#include <iomanip>

using namespace std;
int pierwsza(int a)
{
  for (int i=2;i*i<=a;i++)
    if (a%i==0) return 0;
  return 1;
}
 
int main()
{
	int A,B,min;
	cin>>A;
	cin>>B;
	if (A<B)min=A;
	  else min=B;
	for (int i=2;i*i<=min;i++)
	  if (pierwsza(i)==1 && A%i==0 && B%i==0) cout<<i<<" ";
	 
    
    //system("pause");
    return 0;
} 

Ale teraz mamy drugie zadanie w pewien sposób jest ono takie same ale nie wiemy co zmienić w pierwszym zadaniu aby dobrze działało :)
Oto treść drugiego zadania :
Napisz program, który czyta dwie liczby naturalne N, M (0 ≤ N, M ≤ 1000000) i wypisuje, ile jest
liczb pierwszych w przedziale obustronnie otwartym (|N-M|; N+M).
Na przykład dla liczb
5 7
program powinien wypisać 4, ponieważ w przedziale (2; 12) znajdują się cztery liczby pierwsze: 3,
5, 7, 11.
Uwaga: Liczby 0 i 1 nie są liczbami pierwszymi.

Z góry bardzo dziękuje za odpowiedź :)

1

prosisz i masz, to jeszcze prostsze niż twój program

 #include <iostream>
#include <iomanip>

using namespace std;
int pierwsza(int a)
{
  for (int i=2;i*i<=a;i++)
    if (a%i==0) return 0;
  return 1;
}

int main()
{
        int A,B,C,D,licznik=0;
        cin>>A;
        cin>>B;
        C=A-B;
        if (C<0) C=0-C;
        D=A+B;
        for (int i=C;i<=D;i++)
          if (pierwsza(i)==1) licznik++
        cout << licznik << endl;


    //system("pause");
    return 0;
}

Dla twoich danych wyrzuca 5, bo 2 to też liczba pierwsza (tak więc to 2, 3, 5, 7 11). Zakładam że ujemny wynik różnicy trzeba przerobić na dodatni.

0

Mi nie działa

0

Całkiem optymalne rozwiązanie:

#include <iostream>
using namespace std;

int main()
  {
   unsigned A,B;
   cin>>A>>B;
   while(B) // NWD
     {
      unsigned R=A%B;
      A=B;
      B=R;
     }
   for(unsigned d=2;d*d<=A;++d)
     {
      bool ok=false;
      while(!(A%d))
        {
         A/=d;
         ok=true;
        }
      if(ok) cout<<d<<endl;
     }
   if(A>1) cout<<A<<endl;
   
   //cin.sync(); cin.get();
   return 0;
  }

Można jeszcze przyspieszyć przez eliminacje jednego z dzieleń A%d A/=d;

1 użytkowników online, w tym zalogowanych: 0, gości: 1