Diskuze: Char Spočitavanie znakov
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
... najlepsie asi bude, ked sa s nami podelis o zadanie ulohy
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.
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.
"":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.
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;
}
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.15187194051875842571428751725019245891275871289579817289571982759817928579128917857981798798758912739587197902179587198327598172985719827598172958719275891798571982759172985719285798127598719579175981795719823512571678659170593759179518571095719875917095781247591759712951757198759719285798175798571
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.
Ano je to tak,že je to vygenerované číslo až zo 100000 cislic.
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;
}
#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.
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;
}
Zobrazeno 13 zpráv z 13.