Skocz do zawartości


Zdjęcie

[C++] Wyznaczanie liczb zaprzyjaźnionych z zakresu 1 do n


  • Zaloguj się, aby dodać odpowiedź
9 odpowiedzi w tym temacie

#1 Krzychu25

Krzychu25

    Zaawansowany użytkownik

  • 1 045 postów

Napisano 24 11 2011 - 19:06

No więc mam takie zadanie, w którym muszę z zakresu od 1 do n wyłowić liczby zaprzyjaźnione. Muszę to zrobić za pomocą pętli for i if'ów, lecz nie wiem jak się zabrać. Coś napisałem, co wg mojej logiki powinno działać, jednakże nie działa.

"Liczby zaprzyjaźnione to para różnych liczb naturalnych, takich że suma dzielników każdej z tych liczb równa się drugiej (nie uwzględniając tych dwóch liczb jako dzielników).

Pierwszą parą takich liczb, która została podana już przez Pitagorasa, jest para liczb 220 i 284, ponieważ:
220 = 1 + 2 + 4 + 71 + 142 (dzielniki 284)
284 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 (dzielniki 220)"

Takie coś mam:
#include<iostream>
#include<cstdlib>

using namespace std;

int main()
{
    int n,suma1=0, suma2=0;
    cin>>n;
    
    for(int a=1;a<n-1;a++)//kolejne liczby
    {
    for(int e=1;e<a;e++)//dzielniki
    {
    if(a%e==0)
    {
    suma1+=e;
    for(int b=1;b>suma1;b++)//sprawdzamy dzielniki sumy1
    {
    if(suma1%b==0)
    {
    suma2+=b;
    if (suma1==suma2) cout<<suma1<<" "<<suma2<<endl;
}}}}}

          
system("pause");
return 0;    
}

Mógłby ktoś ogarnięty w temacie poinstruować mnie co i jak?

Użytkownik Krzychu25 edytował ten post 24 11 2011 - 19:44

  • 0

#2 Qauke

Qauke

    Expert

  • 5 156 postów

Napisano 24 11 2011 - 19:51

Wszystko GOOGLE Ci powie :(

LICZBY ZAPRZYJAŹNIONE

liczby naturalne m i n, spełniające warunek: suma wszystkich mniejszych od m dzielników naturalnych liczby m równa się n i jednocześnie suma wszystkich mniejszych od n dzielników naturalnych liczby n jest równa m.
Przykładem liczb zaprzyjaźnionych jest para 220 i 284.
m = 220 n = 284
suma wszystkich mniejszych dzielników liczby m, wynosi:
1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 = n
suma wszystkich mniejszych dzielników liczby n, wynosi:
1 + 2 + 4 + 71 + 142 = 220 = m
Każda liczba doskonała jest zaprzyjaźniona sama ze sobą.
Obecnie znanych jest około dwóch milionów par liczb zaprzyjaźnionych.
Liczby zaprzyjaźnione znali już pitagorejczycy i przypisywali im znaczenie mistyczne.
Nazwę liczb przypisuje się Pitagorasowi, którego gdy zapytano: "Co to jest przyjaciel?" - odpowiedział:
"Przyjaciel to drugi ja; przyjaźń, to stosunek liczb 220 i 284".

  • 0

#3 Krzychu25

Krzychu25

    Zaawansowany użytkownik

  • 1 045 postów

Napisano 24 11 2011 - 20:03

no dobrze, a jak to teraz przełożyć na c++?
  • 0

#4 Qauke

Qauke

    Expert

  • 5 156 postów

Napisano 24 11 2011 - 20:13

zapewne nic nie pomogę, ale to co napisałeś samo w sobie jest zaszyfrowane, a kolejne pytanie co chcesz szyfrować to co na wejściu, czy to co na wyjściu, gdyż pogubiłem się :(

Użytkownik Quke edytował ten post 24 11 2011 - 20:19

  • 0

#5 Krzychu25

Krzychu25

    Zaawansowany użytkownik

  • 1 045 postów

Napisano 24 11 2011 - 20:16

że co?
  • 0

#6 Qauke

Qauke

    Expert

  • 5 156 postów

Napisano 24 11 2011 - 20:22

http://www.elektroda.pl/rtvforum/topic1963390.html poczytaj na tej stronie

sorry tamto nie było do Ciebie
  • 0

#7 Krzychu25

Krzychu25

    Zaawansowany użytkownik

  • 1 045 postów

Napisano 24 11 2011 - 21:53

No to mam tak, ale nie mogę wykombinować jak suma1 wyeliminować z następnej pętelki, żeby się nie wyświetlały podwójnie.

#include<iostream>
#include<cstdlib>
using namespace std;

int main() {
   int n, suma1, suma2;
   cin >> n;
    
   for( int a=1; a<=n; a++ ) 
   {
      suma1= 0;
      for( int e=1; e<a; e++ ) 
         if( a%e==0 )
            suma1 += e;
      suma2= 0;
      for( int b=1; b<suma1; b++ )
         if( suma1%b == 0)
            suma2 += b;
      if( a==suma2&&suma1!=suma2)
         cout << a << " " << suma1 << endl;  
   }
   system("pause");
   return 0;    
}

  • 0

#8 Qauke

Qauke

    Expert

  • 5 156 postów

Napisano 24 11 2011 - 22:12

ciężka sprawa :/

popatrz na to: http://cpp0x.pl/kursy/Kurs-C++/Petla-for/300

powinno pomoc

daj znać jak sobie z tym poradzisz
  • 0

#9 Krzychu25

Krzychu25

    Zaawansowany użytkownik

  • 1 045 postów

Napisano 24 11 2011 - 22:21

Rozwiązanie problemu było trywialne, wystarczyło w ostatnim if'ie dodać a<suma1. Bo pierwsza liczba jest zawsze mniejsza od drugiej, jeżeli zdarza się na odwrót to oznacza, że już to kiedyś mieliliśmy. Oczywiście cały program może być 100 razy szybszy, jednakże moja obecna wiedza nie pozwala, żeby go zrobić.

Użytkownik Krzychu25 edytował ten post 25 11 2011 - 16:46

  • 0

#10 Qauke

Qauke

    Expert

  • 5 156 postów

Napisano 25 11 2011 - 19:42

Więc temat można zamknąć..

  • 0

Zobacz więcej tematów z tagiem: język C++



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych