Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
madewman
Člen
Avatar
madewman:14.3.2019 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.3.2019 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 madewman
martanec:14.3.2019 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
14.3.2019 12:11
Avatar
madewman
Člen
Avatar
Odpovídá na martanec
madewman:14.3.2019 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.3.2019 13:17
Nahoru Odpovědět
14.3.2019 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 madewman
martanec:15.3.2019 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.3.2019 7:57
Avatar
madewman
Člen
Avatar
Odpovídá na martanec
madewman:15.3.2019 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.3.2019 14:08
Nahoru Odpovědět
15.3.2019 14:06
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
Odpovídá na madewman
Matúš Olejník:15.3.2019 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.3.2019 14:33
/* I am not sure why this works but it fixes the problem */
Avatar
madewman
Člen
Avatar
Odpovídá na Matúš Olejník
madewman:15.3.2019 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.3.2019 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 madewman
DarkCoder:15.3.2019 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.3.2019 21:06
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
madewman
Člen
Avatar
Odpovídá na DarkCoder
madewman:15.3.2019 21:12

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

Nahoru Odpovědět
15.3.2019 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 madewman
DarkCoder:15.3.2019 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.3.2019 23:51
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
madewman
Člen
Avatar
Odpovídá na DarkCoder
madewman:16.3.2019 12:35

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

Nahoru Odpovědět
16.3.2019 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 madewman
DarkCoder:16.3.2019 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.3.2019 13:42
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na madewman
DarkCoder:16.3.2019 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.3.2019 18:53
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
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.