Problem z algorytmem

Problem z algorytmem
H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0

Dzień dobry !
Mam do napisania taki algorytm jak poniżej tylko mam z nim problem bo limit pamięci wynosi 64MB ,a mój program go przekracza. Więc mam pytanie gdzie tu najwięcej pamięci jest zabierane i jak to ograniczyć. Z góry dziękuje.

Kopiuj
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>

using namespace std;

unsigned int ccsum(string s)
{
    unsigned int sum = 0;
    for(int i=0; i<s.length(); i++)
    {
        sum += atoi(new char(s[i]));
    }
    return sum;
}
unsigned int ccg(unsigned int n)
{
    return n + (ccsum(to_string(n)) * ccsum(to_string(n)));
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    int x;
    cin >> x;
    long long n[x];
    for(int i=0; i<x; i++)
    {
        cin >> n[i];
    }

    for(int j=0; j<x; j++)
    {

        unsigned int nnx = 1;
        unsigned int nn = n[j];
        while(true)
        {
            if(nnx > nn)
            {
                cout << "NIE" << endl;
                break;
            }
            if(nnx == nn)
            {
                cout << "TAK" << endl;
                break;
            }
            nnx = ccg(nnx);
        }
    }

    return 0;
}



lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4935
0

Co ten program ma robić, Opisz dokładnie.


Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0

Prawdopodobnie tutaj:

Kopiuj
    cin >> x;
    long long n[x];

Chyba nie musisz przechowywać danych z poprzednich kroków aby obliczyć następny więc ta tablica wydaje się zbędna.
Bez znajomości treści zadania oraz zakresów wielkości danych wejściowych ciężko coś doradzić.

AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0
lion137 napisał(a):

Co ten program ma robić, Opisz dokładnie.

Reverse engineering z tak obłędnego fragmentu kodu nie ma szans.

Kopiuj
 sum += atoi(new char(s[i]));

Tu masz po pierwsze wyciek pamięci, a po drugie i dla mnie ważniejsze ten fragment nie ma sensu. Luzując wszelkie "bezpieczniki" w głowie starałem się zrozumieć, co poeta miał na myśli, ale nie zgadłem


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
lion137
Rzeczywiście, mózg roz*ebany :-), ale jak się dowiemy o co chodzi, to będzie można to jakoś naprawiać...
enedil
Czyżby pisał to programista Javy/C#?
H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0
AnyKtokolwiek napisał(a):
lion137 napisał(a):

Co ten program ma robić, Opisz dokładnie.

Reverse engineering z tak obłędnego fragmentu kodu nie ma szans.

Kopiuj
 sum += atoi(new char(s[i]));

Tu masz po pierwsze wyciek pamięci, a po drugie i dla mnie ważniejsze ten fragment nie ma sensu. Luzując wszelkie "bezpieczniki" w głowie starałem się zrozumieć, co poeta miał na myśli, ale nie zgadłem

Ta funkcja sumuje cyfry w liczbie np ccsum(2019) = 12
a ta linijka

Kopiuj
 sum += atoi(new char(s[i]));

dodaje następną cyfre do sumy

edytowany 3x, ostatnio: helikson123
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4935
0

ccsum(2019) = 2163 sumuje cyfry w liczbie? Skąd ten wynik?


H1
Błąd już naprawione
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4935
0

To Wybrałeś chyba najtragiczniejszy sposób sumowania cyfr:) a tak?:

Kopiuj
long sumDigits(long n) {
	long s = 0;
	while (n != 0) {
		s += n % 10;
		n /= 10; 
	}
	return s;
}

H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0
lion137 napisał(a):

To Wybrałeś chyba najtragiczniejszy sposób sumowania cyfr:) a tak?:

Kopiuj
long sumDigits(long n) {
	long s = 0;
	while (n != 0) {
		s += n % 10;
		n /= 10; 
	}
	return s;
}

Dzięki wielkie zamienie funkcje i sprawdzę czy zużycie pamięci zmalało :)

edytowany 1x, ostatnio: helikson123
H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0

Wszystko działa limit pamięci nie jest przekraczany , ale czas jest :(. Limit czasu na to zadanie wynosi 30s.
Podsyłam treść zadania :
Jest funkcja sum(n), która zwraca sumę cyfr liczby n. Jest też funkcja m(n). m(n) = n + sum(n)^2
Z tymi dwoma liczbami zaczynamy proces , który zaczyna się od n=1 i w następnym kroku obliczmy m(n) i przyjmujemy
za n wynik tej funkcji ( n = m(n) ).

Mamy za zadanie określić czy liczbę na wejściu da się uzyskać poprzez ten proces i wypisać TAK / NIE\

Przykłady :

Wejście:
4 - liczba "n" ( wielkość tablicy)
2
1
42
731

Wyjście:
TAK
TAK
TAK
NIE

edytowany 3x, ostatnio: helikson123
hauleth
Jest jakiś zakres dla tych liczb?
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4935
0

Pokaz jaki Masz teraz kod i Podaj dokładna treść zadania z przykładami.


lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4935
0

Co Ty tam tyle Pisałeś, to prosta funkcja jest(nie wiem jak wielkie to moga byc liczby, więc long może nie wystarczyć), a czy można szybciej? Złozoność będzie jakiś ułamek n razy stała, Sprawdź.:

Kopiuj
std::string isReached(long n) {
	if (n == 1) return "TAK";
	long k = 1;
	long num = 0;
	while (k <= n) {
		num = sumDigits(k);
		k += num * num;
		if (k == n) return "TAK";
	}
	return "NIE";
}
int main(){
	std::cout << isReached(1) <<"\n"; // -> TAK
	std::cout << isReached(2) <<"\n"; // -> TAK
	std::cout << isReached(42) <<"\n"; // -> TAK
	std::cout << isReached(731) <<"\n"; // -> NIE
	std::cout << isReached(0) <<"\n"; // -> NIE
	return 0;
}

EDYCJA: Wydaje mi się, że już dla dużych "longów", to będzie działać długo...


edytowany 1x, ostatnio: lion137
H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0
lion137 napisał(a):

Co Ty tam tyle Pisałeś, to prosta funkcja jest(nie wiem jak wielkie to moga byc liczby, więc long może nie wystarczyć), a czy można szybciej? Złozoność będzie jakiś ułamek n razy stała,
Działa superrr test "obciążeniowy" na danych 5*10^9 kończy się w 1,5s.
Bardzo dziękuje za pomoc
Temat zamykam

lion137
Prosze bardzo, Zaakceptuj odpowiedź, żeby inni widzieli, że działa i jest rozwiązane. Nie zamykaj wątku, niech sobie jest dla potomnych :)
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0
helikson123 napisał(a):
AnyKtokolwiek napisał(a):
lion137 napisał(a):

Co ten program ma robić, Opisz dokładnie.

Reverse engineering z tak obłędnego fragmentu kodu nie ma szans.

Kopiuj
 sum += atoi(new char(s[i]));

Tu masz po pierwsze wyciek pamięci, a po drugie i dla mnie ważniejsze ten fragment nie ma sensu. Luzując wszelkie "bezpieczniki" w głowie starałem się zrozumieć, co poeta miał na myśli, ale nie zgadłem

Ta funkcja sumuje cyfry w liczbie np ccsum(2019) = 12
a ta linijka

Kopiuj
 sum += atoi(new char(s[i]));

dodaje następną cyfre do sumy

Dodaje ale "coś zaczynające się od cyfry", przetwarzasz string jeden Pan Bóg wie jakiej długości (specyfikacja atoi).
Masz jakąś obronę co do new char?


Bo C to najlepszy język, każdy uczeń ci to powie
enedil
Nie mścij się, człowiek po prostu nie wie, że w C++ new ma nieco inną semantykę niż w Javie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.