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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Xerocry
0 / 0 / 0
Регистрация: 28.09.2013
Сообщений: 21
#1

Кодирование слов - C++

15.10.2013, 19:22. Просмотров 360. Ответов 1
Метки нет (Все метки)

Здравствуйте, форумчане. Тренируюсь в с++ - пишу программу. Смысл её в кодировании в ту и в другую сторону слов, учитывая, что a-1, b-2, z-26, aa-27(максимальная длина слова-20 символов). Я понял, что это схоже с переводом из 26-ричной системы счисления в десятичную и обратно. Но к сожалению, ни один тип данных не поддерживает такие большие значения, при работе с числами напрямую(26^20+26^19...26^0). Я предполагаю, что необходимо использовать структуры, но не понимаю сам алгоритм ,по которому должна работать программа. Есть работающий пример, но там ничего не понятно. Буду благодарен, если мне кто-либо объяснить, как работает эта программа, или похожий алгоритм.

Заранее спасибо

Программа: http://pastebin.com/WqCZxx2G

C++
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
#include <stdio.h>
#include <conio.h>
#include <locale>
#include <windows.h>
#include <Math.h>
#include <stdlib.h>
 
typedef struct {
        int len;
        int num[50];
} big;
 
 
big number;
big letter;
 
 
 
void sum(big *a, int n, int base)
{
        int i;
 
        for(i=0; i<(*a).len; i++)
        {
                (*a).num[i] += n;
                n = ((*a).num[i] / base);
                (*a).num[i] %= base;
        }
        while (n)
{
                (*a).num[(*a).len] = (base==26 ? n-1 : n);
                n /= base;
                (*a).num[(*a).len] %= base;
                (*a).len++;
        }
}
void mul(big *a, int n, int base) {
        for(int i=0; i<(*a).len; i++) {
                if (base==26) {
                        (*a).num[i] = ((*a).num[i]+1) * n - 1;
                } else {
                        (*a).num[i] *= n;
                }
        }
        n=0;
        for(int i=0; i<(*a).len; i++) {
                (*a).num[i] += n;
                n = ((*a).num[i] / base);
                (*a).num[i] %= base;
        }
        while (n) {
                (*a).num[(*a).len] = (base==26 ? n-1 : n);
                n /= base;
                (*a).num[(*a).len] %= base;
                (*a).len++;
        }
}
 
void
num2letters() {
        int i;
 
        letter.len = 0;
        for(i=number.len-1; i>=0; i--) {
                mul(&letter, 10, 26);
                sum(&letter, number.num[i], 26);
        }
}
 
void letters2num() {
        number.len = 0;
        for(int i=letter.len-1; i>=0; i--)
        {
                mul(&number, 26, 10);
                sum(&number, letter.num[i], 10);
                sum(&number, 1, 10);
        }
}
 
int
main(void) {
        char buf[1024];
 
        while(scanf("%s", buf)==1) {
                int i;
                if (!strcmp(buf, "*")) {
                        break;
                }
 
                if (buf[0]>='0' && buf[0]<='9') {
                        number.len = strlen(buf);
                        for(i=0; i<number.len; i++) {
                                number.num[i] = buf[number.len-i-1]-'0';
                        }
                        num2letters();
                } else {
                        letter.len = strlen(buf);
                        for(i=0; i<letter.len; i++) {
                                letter.num[i] = buf[letter.len-i-1]-'a';
                        }
                        letters2num();
                }
                for(i=letter.len-1; i>=0; i--) {
                        printf("%c", 'a'+letter.num[i]);
                }
                printf("%.*s", 22-letter.len,
                                "                                                       ");
                for(i=number.len-1; i>=0; i--) {
                        printf("%c", '0'+number.num[i]);
                        if (i && (i%3==0)) {
                                printf(",");
                        }
                }
                printf("\n");
        }
 
        exit(0);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2013, 19:22     Кодирование слов
Посмотрите здесь:

C++ Арифметическое кодирование
C++ кодирование текста
Арифметическое кодирование C++
кодирование хаффмана C++
C++ Кодирование, C++
Кодирование по Хаффману, C++ C++
C++ Кодирование
C++ провести побитовое кодирование слов английского языка
Равномерное кодирование C++
C++ Кодирование информации!
Кодирование и декодирование C++
Кодирование Хаффмана C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
15.10.2013, 19:25     Кодирование слов #2
В поисковике вбейте: длинная арифметика.
И сможете сами написать свой класс BigInt
Yandex
Объявления
15.10.2013, 19:25     Кодирование слов
Ответ Создать тему
Опции темы

Текущее время: 04:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru