Witam wszystkich bardzo serdecznie , od pewnego czasu przeglądam forum ale dopiero teraz postanowiłem się zarejestrować by uzyskać jakąś wskazówke co do mojego kodu.
Problem jest następujący.
Wykonujemy na liczbie operacje : A , B i C. A dodaje do liczby 3, B podwaja liczbe, C zamienia ostatnia cyfre liczby z pierwsza cyfra liczby.
Uzytkownik podaje liczbe a my doprowadzamy ja do liczby pierwszej za pomoca A,B i C i wypisujemy ile kroków było potrzebnych by tego dokonać.
Oto moja próba implementacji :
#include <iostream>
#include <cmath>
using namespace std;
int A (int k)
{
k+=3;
return k;
}
int B (int k)
{
k*=2;
return k;
}
int C (int k)
{
int p = k;
int pierwsza_cyfra;
int ilosc_cyfr = 0;
while(p>0) // Funkcję C prawdopodobnie dałoby się zrobić lepiej
{
ilosc_cyfr++;
pierwsza_cyfra = p%10;
p/=10;
}
int ostatnia_cyfra = k%10;
k = k - ostatnia_cyfra + pierwsza_cyfra - pierwsza_cyfra * pow(10,ilosc_cyfr-1) + ostatnia_cyfra * pow(10,ilosc_cyfr-1);
return k;
}
bool jest_pierwsza(int k)
{
if( k == 2) return true;
if(k%2 == 0)return false;
int skrt = ceil(sqrt(k));
for(int i =3 ; i<skrt; i+=2)
{
if (k% i == 0) return false;
}
return true;
}
int doprowadz_do_pierwszej(int k,int ilosc_krokow )
{
if( jest_pierwsza(k) ) return ilosc_krokow ;
else
{
doprowadz_do_pierwszej( A(k),ilosc_krokow+1 );
doprowadz_do_pierwszej( B(k),ilosc_krokow+1 );
doprowadz_do_pierwszej( C(k),ilosc_krokow+1 );
}
}
//Funkcja doprowadz_do_pierwszej "wpada" w wykonywanie ciagle procedury nr 1 a mimo tego na przykład dla liczby 4
nie wypisuje 1 a po prostu zawiesza się.
int main()
{
int k;
while(cin>>k != 0)
{
cout<<doprowadz_do_pierwszej(k,0)<<endl;
}
return 0;
}
Bardzo chciałbym was zapytać o dwie kwestie :
-
Jak optymalniej napisać funkcję C ? Funkcja działa ale wydaje mi się ona nieco rozlazła, czy istnieje lepszy sposób w C++ na wyciągnięcie z liczby jej pierwszej cyfry?
a) Ma ktoś pomysł dlaczego np dla liczby wejsciowej 4 program zawiesza się zamiast ładnie wypisać 1?
b) Dla liczb ktorych nie da sie sprowadzic do liczby pierwszej poprzez wielokrotne dodawanie 3 - jak ogarnąć parę wywołań rekurencyjnych tak aby "mieszały się ze sobą " a nie na przyklad ciagle byla wywolywana jedna funkcja.
Będę wdzięczny za każdą nawet drobną i ironiczną wskazówkę jak również za dłuższe wyjaśnienie sprawy.
Z góry dziękuje i pozdrawiam.