[C++] Szukanie zapętlającej się liczby

matemix
Użytkownik
Użytkownik
Posty: 465
Rejestracja: 10 cze 2008, o 19:38
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 12 razy
Pomógł: 1 raz

[C++] Szukanie zapętlającej się liczby

Post autor: matemix »

Jak napisać program który będzie znajdował liczby które zapętlają się w ciągu (to znaczy - zaczynając od jakiejś liczby po kilku iteracjach znów dostajemy tą liczbę):

\(\displaystyle{ f(x) = \left\{\begin{array}{l} \frac {5x-1}{2} \ \ \ gdy \ x \ nieparzyste\\ \ \ \frac {x}{2} \ \ \ \ \ \ \ gdy \ x \ parzyste \end{array}}\)

po mniej niż 18 iteracjach, szukając ich w zbiorze od 1 do jakiejś ustalonej liczby np. 100. Napisałem coś takiego:

Kod: Zaznacz cały

#include<stdio.h>
#include<math.h>


int main(void)

{

long int c;
long int i;

for(c=1;c<100;c++) 
{
for(i=0;i<18;i++) 
{
if(c%2==1)
{   
c=c*2.5+0.5;
}

else
{
c=c/2;
}


if(c==c){
printf("%d
",&c);

}
}

}

return(0);
}
Ale program wypisuje mi kilkadziesiąt liczb \(\displaystyle{ 2686788}\), nawet nie mam pojęcia dlaczego.
Ostatnio zmieniony 3 mar 2012, o 18:55 przez Afish, łącznie zmieniany 1 raz.
Powód: Stosuj tagi code.
adambak
Użytkownik
Użytkownik
Posty: 1272
Rejestracja: 8 sty 2011, o 18:18
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 295 razy
Pomógł: 115 razy

[C++] Szukanie zapętlającej się liczby

Post autor: adambak »

proszę bardzo:

Kod: Zaznacz cały

#include <stdio.h>

int main(void)
{
  int i;
  long int c,a;

  for(c=1;c<100;c++)
  {
    a=c;
    for(i=0;i<18;i++)
    {
      if(a%2==1)
        a=(5*a-1)/2;
      else
        a/=2;

      if(c==a)
      {
       printf("%d
",c);
       break;
      }
    }
  }

  return 0;
}
porównanie

Kod: Zaznacz cały

c==c
było trochę bez sensu, bo zawsze miało wartość true.. poza tym w printf(); źle kazałeś wypisywać liczbę, bo poprzedzając ją znakiem &.. on wtedy wypisze adres zmiennej (stąd ciągle ta sama liczba, bo & to operator adresu) a nie jej wartość.. no i uważałbym na działania z liczbami typu double, lepiej będzie zapewnić mu dokładność w intach i napisać działanie jak w definicji..
matemix
Użytkownik
Użytkownik
Posty: 465
Rejestracja: 10 cze 2008, o 19:38
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 12 razy
Pomógł: 1 raz

[C++] Szukanie zapętlającej się liczby

Post autor: matemix »

Wiem, że dla tego ciągu liczby np. 19, 23 i inne zapętlają się po mniej niż 18 iteracjach. Natomiast program wypisuje tylko liczby 1 i 2. Czyli nadal robi coś innego.
Mruczek
Użytkownik
Użytkownik
Posty: 1114
Rejestracja: 26 paź 2008, o 19:43
Płeć: Mężczyzna
Podziękował: 23 razy
Pomógł: 157 razy

[C++] Szukanie zapętlającej się liczby

Post autor: Mruczek »

Akurat 19 i 23 chyba się nie zapętlają...

Kod: Zaznacz cały

#include <stdio.h>

int main(void)
{
  int i, j, c;
  long long tab[20], a;
  bool czy;
  for(c=1; c<100; c++){
    a=c;
    tab[0]=a;
    czy=false;
    for(i=1;i<=17;i++){
      if(a%2==1) a=(5*a-1)/2;
      else a/=2;
      for(j=0; j<i; ++j)
         if(tab[j]==a){
            printf("%d
",c);
            czy=true;
            break;
         }
      if(czy) break;
      tab[i]=a;
    }
  }
  return 0;
}

Zakładając, żę chcemy otrzymać tę pierwszą, początkową liczbę to tylko 1 i 2.
Zakładając, że jeżeli po iluś iteracjach liczba którą otrzymamy jest równa otrzymanej wcześniej po mniejszej liczbie iteracji - kod powyżej.
adambak
Użytkownik
Użytkownik
Posty: 1272
Rejestracja: 8 sty 2011, o 18:18
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 295 razy
Pomógł: 115 razy

[C++] Szukanie zapętlającej się liczby

Post autor: adambak »

no to całkiem zmienia kod, ale ja to:
zaczynając od jakiejś liczby po kilku iteracjach znów dostajemy tą liczbę
zinterpretowałem, że ma wrócić do liczby od której zaczęliśmy cały cykl.. tak czy siak wersja Mruczek jest ciekawsza..
matemix
Użytkownik
Użytkownik
Posty: 465
Rejestracja: 10 cze 2008, o 19:38
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 12 razy
Pomógł: 1 raz

[C++] Szukanie zapętlającej się liczby

Post autor: matemix »

Mruczek pisze:Akurat 19 i 23 chyba się nie zapętlają...
Fakt, pomyliłem te liczby z innym ciągiem. Zatem jeszcze raz wszystkie liczby do 100 które zapętlają się do 18 (czyli po mniej niż 18 iteracjach) iteracji: 1, 2, 3, 4, 8, 13, 17, 26, 27, 33, 34, 43, 52, 54, 68, 83.
Mruczek pisze:Zakładając, że jeżeli po iluś iteracjach liczba którą otrzymamy jest równa otrzymanej wcześniej po mniejszej liczbie iteracji - kod powyżej.
Mój kompilator DEV nie rozumie słowa "bool".
adambak pisze:no to całkiem zmienia kod, ale ja to:
zaczynając od jakiejś liczby po kilku iteracjach znów dostajemy tą liczbę
zinterpretowałem, że ma wrócić do liczby od której zaczęliśmy cały cykl..
No to chyba dobrze zintepretowałeś. Przykład:

2, 1, 3, 8, 4, 2

Zaczęśliśmy od liczby 2 i znów dostajemy liczbę 2 i to po mniej niż 18 krokach (bo po 5 krokach).
adambak
Użytkownik
Użytkownik
Posty: 1272
Rejestracja: 8 sty 2011, o 18:18
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 295 razy
Pomógł: 115 razy

[C++] Szukanie zapętlającej się liczby

Post autor: adambak »

jak z 1 otrzymałeś 3? skoro jest 1 to przypadek gdy nieparzyste
\(\displaystyle{ f(x) = \left\{\begin{array}{l} \frac {5x-1}{2} \ \ \ gdy \ x \ nieparzyste\\ \ \ \frac {x}{2} \ \ \ \ \ \ \ gdy \ x \ parzyste \end{array}}\)
czyli \(\displaystyle{ \frac{5\cdot 1-1}{2}=2}\). Napewno dobrze przepisałeś funkcję?
matemix
Użytkownik
Użytkownik
Posty: 465
Rejestracja: 10 cze 2008, o 19:38
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 12 razy
Pomógł: 1 raz

[C++] Szukanie zapętlającej się liczby

Post autor: matemix »

adambak pisze:jak z 1 otrzymałeś 3? skoro jest 1 to przypadek gdy nieparzyste
\(\displaystyle{ f(x) = \left\{\begin{array}{l} \frac {5x-1}{2} \ \ \ gdy \ x \ nieparzyste\\ \ \ \frac {x}{2} \ \ \ \ \ \ \ gdy \ x \ parzyste \end{array}}\)
czyli \(\displaystyle{ \frac{5\cdot 1-1}{2}=2}\). Napewno dobrze przepisałeś funkcję?
Znowu wziąłem inną funkcję, a mianowicie:

\(\displaystyle{ f(x) = \left\{\begin{array}{l} \frac {5x+1}{2} \ \ \ gdy \ x \ nieparzyste\\ \ \ \frac {x}{2} \ \ \ \ \ \ \ gdy \ x \ parzyste \end{array}}\)

W takim razie program Mruczka działa dobrze. Dzięki Mruczek.
ODPOWIEDZ