Omówienie kodu z zamianą liczb z systemu dziesiętnego na system silniowy

0

Proszę o omówienie tego kodu znalazłem go w internecie i mnie zaintrygował ale nie do końca go rozumiem.

#include <iostream>
using namespace std;

int main() {
    int x, cyfra, silnia=1, k=1;
        cin>>x;
    string s="";
        while(silnia<x) 
        {
            k=k+1;
            silnia=silnia*k;
        }
        if(silnia>x) 
        {
            silnia=silnia/k;
            k=k-1;
        }
        while(k>0) 
        {
            cyfra=x/silnia;
            s=s+char(cyfra+'0');
            x=x-cyfra*silnia;
            silnia=silnia/k;
            k=k-1;
        }
        cout<<s;
            
        return 0;
}
3

Dam ci dobrą radę: nie ucz się programować z kodu pisanego przez osobę, która ma 5 minut więcej doświadczenia od ciebie.

Ten program robi coś tak dziwnego, że nie mam pojęcia co ma robić. Masz gdzieś opis co niby ma to robić?
Wyniki dla kolejnych liczb: 0, 1, 2, ...


1
10
11
20
21
100
101
110
111
```
0

to nie pomoże bo nawet jak wstawie za 5489 np. 5 to i tak będzie zły wynik bo wyjdzie 21

Nierozumiem, ten kod:
http://fx-team.fulara.com/zad-4-4-matura-zamiana-system-silniowy/
jest dobry i daje dobry wynik.
Sprawdzane tym kodem:

def dec_to_fac(d):
    if d == 0: return 0
    s = ""
    k = 1
    while d > 0:
        digit = d % k
        s += str(digit)
        d //= k
        k += 1
    if s[0] == "0": s = s[1:]
    return s[::-1]

Który jest bezpośrednim przepisaniem rekurencji przeliczającej z dziesietnego na silniowy.

0

https://godbolt.org/z/3KeYKG

std::ostream& print_factorial_base(std::ostream& out, unsigned x)
{
    constexpr auto bases = factorial_bases<int, 12>(); // wyznacz kolejne podstawy systemu zapisu - constexpr powoduje, że liczone jest tylko raz podczas kompilacji
    if (!x) return out << '0'; // zero jest wyjątkowe, bo to jest jedyny przypadek, gdy na początku zapisu jest cyfra zero
    auto it = std::upper_bound(bases.begin(), bases.end(), x); // znajdź pierwszą podstawę większą od danej liczby
    while (it != bases.begin()) {
        --it; // następna cyfra. Dla pierwszej cyfry podstawa musi być mniejsza lub równa liczbie, by cyfra nie byłą zerem
        out << x / *it; // wyświetl cyfrę dla bieżącej podstawy
        x %= *it; // reszta z dzielenia, wartość dla kolejnych cyfr
    }
    return out;
}

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