Archive

Posts Tagged ‘сирцевий код’

Код на c++11 для китайської теореми про залишки

Припускають, що назва “китайська теорема про залишки” з’явилась від такого запитання: Як багато солдатів в армії Хан Сінга, якщо вишикувати їх у три шереги, то два солдати залишаться зайвими, якщо вишикувати у п’ять шерег, то три солдати не в шерегах і якщо вишикувати у сім шерег, то два солдати зайві.

Наводжу код на с++11 для розв’язання задач за китайською теоремою про залишки:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template<class T> void ex_al_eu_in(const T &r1, const T &r2, const T &x1, const T &x2, const T &y1, const T &y2, T &gcd, T &a, T &b) {
    T r3 = r1 - r2 * (r1 / r2);
    T x3 = x1 - x2 * (r1 / r2);
    T y3 = y1 - y2 * (r1 / r2);
    if (0 != r3)
        ex_al_eu_in(r2, r3, x2, x3, y2, y3, gcd, a, b);
    else {
        gcd = r2;
        a = x2;
        b = y2;
    }
}

template<class T> void ex_al_eu(const T &r1, const T &r2, T &gcd, T &a, T &b) {
    if (0 == r1 || 0 == r2)
        gcd = a = b = 0;
    else
        ex_al_eu_in(r1 > r2 ? r1 : r2, r1 < r2 ? r1 : r2, T(1), T(0), T(0), T(1), gcd, r1 > r2 ? a : b, r1 < r2 ? a : b);
}

vector<int> modules = {3,5,7};
vector<int> remainders = {2,3,2};
vector<int> ys(remainders.size());

int main() {
    int m_big = 1;
    for(int r : modules) { m_big *= r; };
    int answer = 0;
    transform(modules.begin(), modules.end(), modules.begin(), ys.begin(), [m_big](int mod, int y){ 
            int gcd, f;
            int m = m_big / mod;
            ex_al_eu(mod, m, gcd, f, y);
            return y*m; 
        });
    cout << inner_product(remainders.begin(), remainders.end(), ys.begin(), 0) << endl;
    return 0;
}

Компілюємо так:
g++ ім’я.cpp -std=c++0x

Advertisements
Категорії:C++ Позначки:,

Переведення числового запису в його рядковий відповідник

У багатьох програмістів в житті наступає момент, коли виникає потреба в переведенні числа, наприклад прочитаного з бази даних, в рядок як воно читається. Зазвичай для формування фінансових документів. Таке завдання випало й мені. Результат програми виглядає так:
123.12 – сто двадцять три грн. 12 коп.
123832 – сто двадцять три тисячі вiсiмсот тридцять двi грн. 12 коп.
12394355.12 – дванадцять мiльйонiв триста дев’яносто чотири тисячі триста п’ятдесят п’ять грн. 12 коп.

Далі подаю код:
Читати далі…

Категорії:Uncategorized Позначки:,