Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Реализация Китайской теоремы об остатках - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Геттеры создают объекты http://www.cyberforum.ru/cpp-beginners/thread1011443.html
Пытаюсь из класса вытащить поле map class AutoShop { map<int, Manager> mapManagers; map<int, Client> mapClients; map<int, AutoConfiguration> mapAutoConfigurations; template <class T>...
C++ прога для графикы какая нужна программа для написания графики в С++? http://www.cyberforum.ru/cpp-beginners/thread1011438.html
Создать одномерный массив, заполнить его случайными значениями, отсортировать массив по убыванию C++
создать одномерный массив, заполнить его случайными значениями, отсортировать массив по убыванию. получилось вот что: #include <iostream> #include <stdlib.h> #include <time.h> #include...
C++ Преобразование объектов одного класса в объекты другого
Есть сей код.Тут я пытаюсь осуществить преобразование объекта класса myCl к классу myCl2. Код вызывает завершение работы компилятора. В чем может быть проблема ? #include <iostream> using...
C++ Удалить все цифровые символы из строки http://www.cyberforum.ru/cpp-beginners/thread1011424.html
Из строки нужно удалить все цифровые символы. Наработки пока такие: char* pIn = pTmp; char* pOut = pTmp; while (*pIn != '\0') { if (isdigit(*pIn)) while (isdigit(*pIn) && *pIn)...
C++ Почему не работает if-else Привет, форумчане! Значицца, так, дано задание (опущу ненужное) задать диапазон массива от 1 до 20. >Если да, то выполнять следующее действие. >Если нет, писать "Error. Write again." "If"... подробнее

Показать сообщение отдельно
DmitriiS
Сообщений: n/a

Реализация Китайской теоремы об остатках - C++

18.11.2013, 22:56. Просмотров 1771. Ответов 1
Метки (Все метки)

Задача программы - найти X, исходя из трёх сравнений.
Код я написал, но никак не пойму, почему X принимает отрицательное, да и неправильное значение.
Проверьте, пожалуйста, если кому не лень)

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
 
//Функция для вычисления НОД - проверка взаимно простых
unsigned int gcd(unsigned int a, unsigned int b)
{
    while (a && b)
        if (a >= b)
           a = a % b;
        else
           b = b % a;
    return a | b;
}
 
//Функция Эйлера
int euler(int n)
{
    int ans;
    ans = n;
    for (int i = 2; i*i <= n; i++)
        if (n % i == 0)
        {
            while (n % i == 0) n = n/i;
            ans = ans - ans / i;
        }
    if (n > 1) ans = ans - ans / n;
    return ans;
}
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    //x = a(mod m)
    int A, i, j, k, c, X;
    setlocale(LC_ALL, "Russian");
 
    //снимем нужные данные с клавиатуры
    cout << "Вы имеете систему уравнений вида:" << endl << "x = a[1] (mod m[1])" << endl << 
        "x = a[2] (mod m[2])" << endl << "..............." << endl << "x = a[k] (mod m[k])" << endl << "где i = 1, 2, ..., k." << endl;
    cout << "Программа создана для того, чтобы реализовывать Китайскую теорему об остатках," << endl << " т.е. находить число X по остаткам от деления на взаимно простые числа." << endl <<
        "Введите сначала число k - количество уравнений системы." << endl;
    cin >> k;
    if (cin.fail())
        do
        {
            cout << "---Error!---" << "Введите число!" << endl;
            cin.clear();
            cin.sync();
            cin >> k;
        }
        while (cin.fail());
 
    int *m = new int[k];
    int *a = new int[k];
    int *N = new int[k];
    int *M = new int[k];
    int *f = new int[k];
    memset(m, 0, sizeof(m));
    memset(a, 0, sizeof(a));
    memset(N, 0, sizeof(N));
    memset(M, 0, sizeof(M));
    memset(f, 0, sizeof(f));
 
    retry : ;//при ошибке возврат сюда
    for (int i=0; i<k; i++)//a[i] и m[i]
    {
        cout << "Введите числа m[" << i + 1 << "] и a[" << i + 1 << "] через пробел соответственно." << endl;
        cin >> m[i];
        if (cin.fail())
            do
            {
                cout << "---Error!---" << "Введите число!" << endl;
                cin.clear();
                cin.sync();
                cin >> m[i];
            }
            while (cin.fail());
 
        cin >> a[i];
        if (a[i] > m[i])
            do
            {
                cout << "a[i] должно быть меньше m[i]" << endl;
                cin.clear();
                cin.sync();
                cin >> a[i];
                if (cin.fail())
                    do
                    {
                        cout << "---Error!---" << "Введите число!" << endl;
                        cin.clear();
                        cin.sync();
                        cin >> a[i];
                    }
                    while (cin.fail());
            }
            while (a[i] > m[i]);
    }
 
    //проверим, взаимно ли просты элементы массива m
    for (int i=0; i < k; i++)
        for (int j=0; j < k; j++)
            if ((i != j) && (gcd(m[i], m[j]) != 1))
            {
                cout << "m[i] должны быть взаимно просты! Возврат к вводу m[i] и a[i]." << endl;
                goto retry;
            }
 
    //приступим, наконец к нахождению X
    A = 1;
    for (int i=0; i < k; i++)
        A = A * m[i];
    for (int i=0; i < k; i++)
        M[i] = A / m[i];
 
    for (int i=0; i < k; i++)
    {
        f[i] = euler(m[i]);
        //N[i] = exp(M[i] * log(f[i] - 1.0));
        c = N[i];
        for (int j=1; j <= f[i] - 1; j++)
            N[i] = N[i] * c;
        N[i] = N[i] % m[i];
    }
 
    //само значение X
    X = 0;
    for (int i=0; i < k; i++)
        X = X + a[i] * N[i] * M[i];
    
    cout << "Решение системы сравнений" << endl;
    for (int i=0; i < k; i++)
        cout << "X = " << a[i] << "(mod" << m[i] << ")" << endl;
    cout << "имеет вид:" << endl << "X = " << X << "(mod" << A << ")" << endl;
 
    delete[] m;
    delete[] a;
    delete[] N;
    delete[] M;
    delete[] f;
    system("pause");
    return 0;
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru