Przykładowe rozwiązania zadań z kolokwium poprawkowego

Numerologia

Zadanie

Zadaniem programu jest obliczenie sumy cyfr podanej liczby, następnie obliczenie sumy cyfr tej sumy itd., aż do uzyskania liczby jednocyfrowej. Dla przykładu dla liczby 98 wynik to 8, bo 9+8 = 17, a 1+7 = 8.

Opis wejścia

Pierwsza linijka wejścia zawiera liczbę T testów (1 <= T <= 100). W T następnych linijkach znajduje najpierw liczba N oznaczająca liczbę cyfr (1 <= N <= 1000), a następnie liczba N-cyfrowa. Może się zdarzyć, że na początku liczby N-cyfrowej występują zera, program powinien je ignorować (zauważmy, że nie wpływają one na sumę).

Opis wyjścia

Dla każdego testu należy na wyjściu napisać jednocyfrowy wynik, będący sumą cyfr sumy cyfr itd. podanej liczby N-cyfrowej.

Przykład

Wejście

3
3 321
4 0055
16 1111111111111111

Wyjście

6
1
7
#include <iostream>
#include <cstdio>
using namespace std;

char digits[100];

int sumDigits(const char* s) {
    int sum = 0;
    while(*s != 0)
        sum += *(s++)-'0';
    return sum;
}

int sumDigits(int n) {
    sprintf(digits, "%d", n);
    return sumDigits(digits);
}

void test() {
    int x;
    cin >> x;
    string n;
    cin >> n;
    int t = sumDigits(n.c_str());
    while(t > 9) {
        t = sumDigits(t);
    }
    cout << t << endl;
}

int main() {
    int n;
    cin >> n;
    while(n--)
        test();
    return 0;
}

Modulo

Zadanie

Zadaniem programu jest obliczenie reszty z dzielenia bardzo dużej liczby przez drugą, podaną liczbę.

Opis wejścia

Pierwsza linijka wejścia zawiera liczbę M przez którą będziemy dzielić, (2 <= M <= 100). Następna linjka zawiera liczbę N (1 <= N <= 1000), która jest liczbą cyfr interesującej nas liczby. Trzecia linijka zawiera N-cyfrową liczbę, dla której należy wypisać resztę z dzielenia przez M.

Opis wyjścia

Wyjście zawiera resztę z dzielenia podanej liczby przez M.

Przykład 1

Wejście

11
11
12345678901

Wyjście

6

Przykład 2

Wejście

97
25
1234567890123456789012345

Wyjście

5
#include <iostream>
#include <cstdio>
using namespace std;


int main() {
    int mod;
    cin >> mod;
    int n;
    cin >> n;
    int suma = 0;
    while(n--) {
        char c;
        cin >> c;
        suma *= 10;
        suma += c-'0';
        suma %= mod;
    }
    cout << suma;
    return 0;
}

Literki

Zadanie

Zadaniem programu jest wypisać wszystkie występujące w słowie litery, w kolejności malejącej wg. kodów ASCII (każda litera ma być wypisana najwyżej raz, niezależnie od wielokrotnych wystąpień w badanym słowie).

Opis wejścia

Pierwsza linijka wejścia zawiera liczbę T słów do przetestowania (1 <= T <= 1000). W T następnych linjkach podane są słowa do przetestowania (każde słowo jest niepuste, składa się z małych liter od a do z i jest nie dłuższe niż 30 znaków).

Opis wyjścia

Dla każdego słowa należy wypisać w osobnej linijce występujące w słowie litery, posortowane od z do a.

Przykład

Wejście

3
abcabcabc
ppppppppp
aplkip

Wyjście

cba
p
plkia
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    while(n--) {
        string word;
        cin >> word;
        sort(word.rbegin(), word.rend());
        char written;
        cout << (written = word[0]);
        for(string::iterator it = word.begin(); it != word.end(); ++it) {
            if(*it != written)
                cout << (written = *it);
        }
        cout << endl;
    }
    return 0;
}

Lietrki nieposortowane

Zadanie

Zadaniem programu jest wypisać wszystkie występujące w słowie litery, w kolejności takiej w jakiej po raz pierwszy występują w słowie (każda litera wypisywana jest najwyżej raz, niezależnie od wielokrotnych wystąpień w słowie).

Opis wejścia

Pierwsza linijka wejścia zawiera liczbę T słów do przetestowania (1 <= T <= 1000). W T następnych linjkach podane są słowa do przetestowania (każde słowo jest niepuste, składa się z małych liter od a do z i jest nie dłuższe niż 30 znaków).

Opis wyjścia

Dla każdego słowa należy wypisać w osobnej linijce występujące w słowie litery, w takiej kolejności w jakiej występują w słowie po raz pierwszy.

Przykład

Wejście

3
zzzzzzzaassss
pppppppp
apropos

Wyjście

zas
p
apros
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

int main() {
    int n;
    cin >> n;
    while(n--) {
        string word;
        cin >> word;
        set<char> written;
        for(string::iterator it = word.begin(); it != word.end(); ++it) {
            if(written.find(*it) == written.end()) {
                cout << *it;
                written.insert(*it);
            }
        }
        cout << endl;
    }
    return 0;
}

Anagramy

Zadanie

Zadaniem programu jest sprawdzić czy wszystkie podane słowa są nawzajem swoimi anagramami (tzn. są złożone z tych samych liter, najwyżej poprzestawianych).

Opis wejścia

Pierwsza linijka wejścia zawiera liczbę T słów do przetestowania (1 <= T <= 1000). W T następnych linjkach podane są słowa do przetestowania (każde słowo jest niepuste, składa się z małych i wielkich liter od A do Z i jest nie dłuższe niż 30 znaków).

Opis wyjścia

Należy wypisać TAK, jeżeli wszystkie słowa są nawzajem swoimi anagramami lub NIE, jeśli nie są.

Przykład 1

Wejście

3
abcdea
aabced
eadcba

Wyjście

TAK

Przykład 2

Wejście

3
abcde
ebcda
zzzzz

Wyjście

NIE
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    n--;
    string word;
    cin >> word;
    sort(word.begin(), word.end());
    while(n--) {
        string nextWord;
        cin >> nextWord;
        sort(nextWord.begin(), nextWord.end());
        if(word != nextWord) {
            cout << "NIE";
            return 0;
        }
    }
    cout << "TAK";
    return 0;
}

Posortuj cyfry

Zadanie

Zadaniem programu jest obliczenie różnicy podanej liczby i liczby powstałej z posortowania jej cyfr w rozwinięciu dziesiętnym w kolejności niemalejącej. Dla przykładu dla liczby 518 wynik to 360, bo 518-158 = 360.

Opis wejścia

Pierwsza linijka wejścia zawiera liczbę T testów (1 <= T <= 100). W T następnych linijkach znajdują się liczby N do przetestowania (1 <= N <= 1000000).

Opis wyjścia

Dla każdego testu należy na wyjściu napisać wynik obliczony jak opisano w treści zadania. Zauważmy, że wynik zawsze jest liczbą nieujemną. Ewentualne zera występujące po posortowaniu cyfr należy ignorować (zgodnie z normalną interpretacją zapisu dziesiętnego).

Przykład

Wejście

3
1000000
235
93692

Wyjście

999999
0
69993
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;

void test() {
    string n;
    cin >> n;
    string sorted = n;
    sort(sorted.begin(), sorted.end());
    cout << atoi(n.c_str()) - atoi(sorted.c_str()) << endl;
}

int main() {
    int n;
    cin >> n;
    while(n--)
        test();
    return 0;
}