Java týden Java týden
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě
Avatar
Wolf
Člen
Avatar
Wolf:14. března 8:43
char input[10000];
char save_number[1000]

scanf("%c",input);
while(){

}

Zkusil jsem:

char input[10000];
char save_number[1000]

scanf("%c",input);
while(){

}

Chci docílit: Potrebujem pomôcť s počítavanim čísel v char poli vždy dve čísla mám čísla napríklad v poli vložené ['1','5','6',­'8','9','15'];vzdy takto 1+5 = 6, 6+8=14; 9+15=24 a ulozit ich do pola a znova az pokial nedostanem jedno cislo vysledne cislo. Pole znakov je kvoli tomu take velke lebo neviem kolko znakov mi vygenereuje pocitac a datove typy ako unsigned long long int na to nestacia kapacitne.

Odpovědět 14. března 8:43
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
martanec
Člen
Avatar
Odpovídá na Wolf
martanec:14. března 12:11
  1. preco pole char-ov? preco nie pole int-ov?
  2. ked uz pole charov, '15' nie je char, to uz je string / char * / char[2]
  3. vstupy nacitavas zo suboru, z prikazoveho riadku, alebo (ako pises) ti ich generuje 'pocitac'? v kazdom pripade vies vzdy zistiti koncovy pocet cisel. Ak na zaciatku nevies, ake velke pole alokovat, pouzi bud to dynamicke pole, alebo nejaky kontajner (std::vector / std::list / vlastna implementacia linearne zretazeneho zoznamu / ... zalezi od dovolenych technologii)
  4. ...

... najlepsie asi bude, ked sa s nami podelis o zadanie ulohy :)

 
Nahoru Odpovědět  +1 14. března 12:11
Avatar
Wolf
Člen
Avatar
Odpovídá na martanec
Wolf:14. března 13:15

https://kurzy.kpi.fei.tuke.sk/…o.solve.html zadania
Technológie nie sú dovolene žiadne knižnice atd ... Čísla sú generovane pc Dovolené knižnice su std a tak ďalej.

Editováno 14. března 13:17
Nahoru Odpovědět 14. března 13:15
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
martanec
Člen
Avatar
Odpovídá na Wolf
martanec:15. března 7:57

Link nie je funkcny.
Pises:
"Technológie nie sú dovolene žiadne knižnice atd ..."
a hned na to "Dovolené knižnice su std a tak ďalej."

Co je teda pravda?

A prosim ta, zacni pouzivat interpunkcne znamienka. Ulahci to ludom lepsie pochopit to, co im chces povedat.

 
Nahoru Odpovědět 15. března 7:57
Avatar
Wolf
Člen
Avatar
Odpovídá na martanec
Wolf:15. března 14:06

"":https://kurzy.kpi.fei.tuke.sk/…o.solve.html
Po vstupe na stránku treba kliknuť na Minulý Metod a tam je znenie zadania.
Dovolené sú knižnice ktoré sú v klasickom Cčku napr. math.h,stdlib­.h,stdio.h.

Editováno 15. března 14:08
Nahoru Odpovědět 15. března 14:06
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
Odpovídá na Wolf
Matúš Olejník:15. března 14:33

Neviem kde tam máš napísané, také znenie ako si napísal ty tu, možno zle pozerám, ale ja som tam našiel takéto niečo

Na vstupe dostaneme číslo 165. Pri použití metódy MM spočítame každú cifru (1+6+5). Výsledok je 12. Kedže 12 je dvojciferné číslo opät voláme metódu MM (1+2). Výsledkom je číslo 3, ktoré je jednociferné, a teda metódu môžeme ukončiť.

Robíš ciferný súčet dokým nemá číslo len jednu cifru

#include <stdio.h>

int mm(int num){
    int result = 0;
    int tmp;

    if(num / 10 == 0){
        return num;
    }
    while(1){
        tmp = num % 10;
        result += tmp;
        num /= 10;

        if(num == 0){
            return mm(result);
        }
    }
    return 0;
}

int main() {
    printf("Vysledok = %d", mm(1721));

    return 0;
}
Nahoru Odpovědět 15. března 14:33
/* I am not sure why this works but it fixes the problem */
Avatar
Wolf
Člen
Avatar
Odpovídá na Matúš Olejník
Wolf:15. března 19:06

V zadaní to nepíše ale keď to uploadujem dany kod do servera kde sa to testuje tak server negeneruje čísla v rozsahu int ale 1000 až 100000 cisel hned zasebou.
Napr.15187194051­875842571428751725019245­891275871289579817289571­982759817928579128917857­981798798758912739587197­902179587198327598172985­719827598172958719275891­798571982759172985719285­798127598719579175981795­719823512571678659170593­759179518571095719875917­095781247591759712951757­198759719285798175798571

Nahoru Odpovědět 15. března 19:06
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:15. března 21:06

Zadání jasně říká:

1. Vstupom može byť len prirodzené číslo (študentský identifikátor).

Tedy vstupem je jen jedno přirozené (N, N0, N+) číslo (0, 1, … 10, …, atd. ), nikoli čísla resp. více čísel, žádná pomlčka.

Jestli si se špatně nevyjádřil a měl namysli, že na vstupu je generováno jediné číslo tvořené až ze 100000 číslic.

Pokud to ani takto není, pak je zadání úlohy nepřesné a Ivan se bude muset poprat s derivacemi a integrály sám.

Nahoru Odpovědět 15. března 21:06
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Wolf
Člen
Avatar
Odpovídá na DarkCoder
Wolf:15. března 21:12

Ano je to tak,že je to vygenerované číslo až zo 100000 cislic.

Nahoru Odpovědět 15. března 21:12
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:15. března 23:51

Zde máš řešení.

Vytvoříš si dynamické plovoucí jednorozměrné pole, jehož velikost si přizpůsobuješ dle potřeby. Ze vstupu postupně načítáš znaky dokud není vstupní buffer prázdný (poslední znak je znak nového řádku). Každý znak si převedeš na číselnou hodnotu, kterou následně uložíš do pole. Zjistíš součet všech číslic v poli, provedeš rozklad součtu (součet ze součtu), to celé rozkládáš tak dlouho dokud není výsledek jednociferný. Nakonec výsledek vypíšeš na obrazovku.

#include <stdio.h>
#include <stdlib.h>

#define MEMBLOCK 100

int mm(char *arr, int size);

int main(void) {
        char *buffer = NULL;
        int c, mem = 0, pos = 0;

        mem += MEMBLOCK;
        buffer = (char *)malloc(mem);
        if (!buffer) {
                fprintf(stderr, "Chyba alokace pameti.\n");
                exit(1);
        }

        do {
                if (mem == pos) {
                        mem += MEMBLOCK;
                        buffer = (char *)realloc(buffer, mem);
                        if (!buffer) {
                                fprintf(stderr, "Chyba alokace pameti.\n");
                                exit(1);
                        }
                }
                c = getchar();
                if (c != '\n') *(buffer + pos++) = c - '0';
        } while (c != '\n');

        printf("%d", mm(buffer, pos));

        free(buffer);
        buffer = NULL;

        return 0;
}

int mm(char *arr, int size) {
        int i, num = 0;

        for (i = 0; i < size; i++) num += *(arr + i);

        while (num > 9) {
                int sum = 0;
                do {
                        sum += (num % 10);
                        num /= 10;
                } while (num);
                num = sum;
        }
        return num;
}
Nahoru Odpovědět 15. března 23:51
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Wolf
Člen
Avatar
Odpovídá na DarkCoder
Wolf:16. března 12:35

#define MEMBLOCK 100 Tento príkaz čo znamená?

Nahoru Odpovědět 16. března 12:35
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:16. března 13:42

#define je direktiva preprocesoru která slouží pro definici makra. V tomto případě je vytvořená číselná konstanta MEMBLOCK, která je pak při překladu nahrazena hodnotou 100.

Nahoru Odpovědět 16. března 13:42
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Wolf
DarkCoder:16. března 18:53

Varianta 2 - přímá analýza vstupu

#include <stdio.h>

int main(void) {
        int c, sum = 0;

        do {
                c = getchar();
                if (c != '\n') sum += (c - '0');
        } while (c != '\n');

        while (sum > 9) {
                int sum2 = 0;
                do {
                        sum2 += (sum % 10);
                        sum /= 10;
                } while (sum);
                sum = sum2;
        }

        printf("%d", sum);

        return 0;
}
Nahoru Odpovědět 16. března 18:53
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.