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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
MILAN
886 / 780 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
#1

Системы счисления!!!! - C++

20.02.2010, 18:26. Просмотров 1279. Ответов 10
Метки нет (Все метки)

Мне надо перевести число с 8-ричной в 10-тичную систему и обратно, и меня интересуют такие вопросы!!!

1 - как сделать число , больше типа long (где то 20 розрядов)
2 - как переобразовать число в строку
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2010, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Системы счисления!!!! (C++):

Простейший алгоритм перевода числа из 10 системы счисления в 16 ричную систему счисления - C++
Помогите написать самый простой алгоритм перевода из 10 системы счисления в 16 ричную систему счисления! Мне нужен именно самый простенький...

Перевод натурального числа из десятичной системы счисления в систему счисления по основанию - C++
Здравствуйте. Я хотела бы попросить у вас помощи. Я понимаю, что это не очень красиво, но вдруг кто-нибудь откликнется. Я не очень...

Программа обучения переводу чисел из десятичной системы счисления в 2 10 и 16 систем счисления - C++
дали задание составить программу нужно чтобы на экран выводилось это: Программа обучение переводу чисел из десятичной систем...

Перевод строки из 2-ной системы счисления в 8-ную систему счисления - C++
помогите пожалуйста как сделать перевод строки из 2 системы счисления на 8 систему счисления через массив ?

Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно - C++
Нужно две программы, одна реализует перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки, а другая...

Написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления - C++
Помогите написать программу, которая переводит число из десятичной системы счисления в позиционную систему счисления. Цифра в самом младшем...

10
MotherBoard
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
20.02.2010, 18:31 #2
Включите калькулятор в ОС в режим "Инженерный" и нет проблем
0
MILAN
886 / 780 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
20.02.2010, 18:32  [ТС] #3
Мне надо програму написать!!!!
0
MotherBoard
Путешественница
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
20.02.2010, 18:34 #4
Цитата Сообщение от MILAN Посмотреть сообщение
Мне надо програму написать!!!!
Программу можно писать по разному...есть режим консоли, а есть пользовательский интерфейс..
Иными словами - разные формы проектов..
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
20.02.2010, 18:35 #5
(С)википедия
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
#include <string>
#include <iostream>
 
using namespace std;
 
char ntoa(int n) // преобразование номера цифры в символ 
{
    if ((n >= 0) && (n <= 9))
        return '0' + n;
    else
        return 'A' - 10 + n;
 
}
 
int aton(char a) // преобразование символа в номер цифры
{
    if ((a >= '0') && (a <= '9'))
        return a - '0';
    else if ((a >= 'a') && (a <= 'z'))
        return a - 'a' + 10;
    else
        return a - 'A' + 10;
}
 
// Преобразование из одной системы счисления в другую 
// s - число в системе счисления по основанию fs
// функция возвращает число в системе счисления fd
string conv(string s, int fs, int fd)
{
    int A = 0;
    for (unsigned int i = 0; i < s.length(); i++)
    {
        char a;
        a = aton(s[i]);
        if ((a >= 0) && (a <= fs))
            A = A * fs + a;
        else
            return "number has uncorrect format";
        // число в неверном формате
    }
    string sd = "";
    while (A != 0)
    {
        sd = ntoa(A % fd) + sd;
        A /= fd;
    }
    return sd;
}
int main(int argc, char* argv[])
{
    while (true)
    {
        string s;
        int fs, fd;
        cout << "Enter number, base and convert base: ";
        // Введите число, основание и основание конвертирования
        cin >> s >> fs >> fd;
        cout << conv(s, fs, fd) << endl;
    }
 
    return 0;
}

1 - как сделать число , больше типа long (где то 20 розрядов)
Хм... интересно double подойдет?
2 - как переобразовать число в строку
Функция itoa?
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
20.02.2010, 18:43 #6
  1. Используй long long
  2. функция char *_itoa( int value, char *str, int radix)


0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
20.02.2010, 18:51 #7
Цитата Сообщение от MILAN Посмотреть сообщение
1 - как сделать число , больше типа long (где то 20 розрядов)
если компилятор поддерживает, unsigned long long int

Цитата Сообщение от MILAN Посмотреть сообщение
2 - как переобразовать число в строку
C++
1
2
3
4
5
6
7
8
#include <sstream>
#include <string>
...
int num;
std::ostringstream ost;
ost << num;
std::string s = ost.str();
...
0
MILAN
886 / 780 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
20.02.2010, 18:54  [ТС] #8
insideone, програма выдает ошыбку в функции conv!! У меня компилятор TC++!!!
0
insideone
Модератор
Автор FAQ
3642 / 921 / 50
Регистрация: 10.01.2010
Сообщений: 2,477
20.02.2010, 19:02 #9
2 MILAN. Вместо int A = 0; => unsigned long long int A = 0; сделали?
0
MILAN
886 / 780 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
20.02.2010, 19:04  [ТС] #10
Извиняюсь, запустил в DEV-C++ все работает!!!! Спасибо!!!!
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.02.2010, 21:58 #11
мой курсач:
my.hpp
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
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <windows.h>
#include <conio.h>
 
#define FOR(i,a,b) for (int i = a, _n(b); i < _n; ++i)
#define ABS(a) ( (a) < 0 ? -(a) : a )
 
//оголошення констант ----------------------------------------------------------
const int tSleep = 1500;        //час затримки
 
//перевантаження операторів введення -------------------------------------------
std::ostream &operator << (std::ostream &cout, const char text[])
{
    char *s = new char [strlen(text)+1];
    CharToOem(text, s);
    cout.write(s,strlen(s));
    return cout;
}
 
std::ostream &operator << (std::ostream &cout, const char text)
{
    const char s[] = {text,'\0'};
    char *ds = new char [2];
    CharToOem(s, ds);
    cout.write(ds,strlen(ds));
    return cout;
}
 
//меня виходу ------------------------------------------------------------------
namespace my
{
    int exit()
    {
        int exit = 0;
        while (exit != '2')
        {
            std::cin.clear();
            std::cout << "Виберiть дiю:\n\n"
                     "1 - вийти\t"
                     "2 - продовжити\n";
            exit = getch();
            if (exit == '1')
            {
                system("cls");
                std::cout << "завершення..";
                Sleep(tSleep);
                return 1;
            }
            if (exit != '2')
            {
                system("cls");
                std::cout << "\nПомилка введення\t"
                         "спробуйте ще раз ";
                Sleep(tSleep);
            }
            system("cls");
        }
        return 0;
    }
}
 
//==============================================================================
 
//                            додаткові функції
 
//==============================================================================
 
//перевірка символа на належність "." ------------------------------------------
inline int IsPoint(char &s) { return s == '.'; }
 
//перевірка чи являеться стрічка цілим числом-----------------------------------
int IsDigit(std::string &s)
{
    FOR(i,0,s.size()) if (s[i] < '0' || s[i] > '9') return 0;
    return 1;
}
 
//перевірка на допустимий діапазон значень для систем числення -----------------
int Check()
{
    std::string s;
    std::cin >> s;
    std::stringstream tmp;
    tmp << s;
    int res;
    tmp >> res;
    return (res <= 36 && res >= 2 && IsDigit(s)) ? (res) : (0);
}
 
//переведення стрічки у верхній регістр-----------------------------------------
void Up(std::string &s) { FOR(i,0,s.size()) if (isalpha(s[i])) s[i] += (s[i] >= 'a') ? ('A'-'a') : (0); }
 
//нормалізація стрічки
void Normalization(std::string &s)
{
    int count = 0;
    while (s[s.size()-count-1] == '0') ++count;
    if ( s[s.size()-count-1] == '.') ++count;
    s = s.substr(0, s.size() - count);
}
code.cpp
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
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include "my.hpp"
 
using namespace std;
 
//опис констант-----------------------------------------------------------------
const int base = 1000*1000;         //база числа в довгій арифметиці
 
//опис функцій------------------------------------------------------------------
void Menu();
void Notation(string &, int &, int &);
vector <int> NotationFrom(string, int &);
vector <int> NotationTo(vector <int>, int &);
string NotationDiv(string, int &, int &);
vector <int> Div(vector <int>, int, int &);
vector <int> Mult(vector <int>, int);
vector <int> Sum(vector <int>, vector <int>);
 
//MAIN()------------------------------------------------------------------------
int main()
{
    Menu();
    return 0;
}
 
//меню програми----------------------------------------------------------------
void Menu()
{
    while (1)
    {
        int from, to;
        string s;
        cout << "Введiть початкову систему числення [2..36]: ";
        while( !(from = Check()) ) cout << "помилка введення\n\nспробуйте ще раз: ";
        cout << "\nВведiть кiнцеву систему числення [2..36]:   ";
        while( !(to = Check()) ) cout << "помилка введення\n\nспробуйте ще раз: ";
        cout << "\nВведiть число:                              ";
        cin >> s;
        cout << endl;
 
        Notation(s, from, to);
            
        if (my::exit()) break;
    }
}
 
//основна функція---------------------------------------------------------------
void Notation(string &s, int &from, int &to)
{
    //переводимо цілу частину в десяткову систему числення
    vector <int> res;
    Up(s);
    int count = 0;
    FOR(i,0,s.size()) 
    {
        if ( !IsPoint(s[i]) ) ++count;
        if ( IsPoint(s[i]) ) break;
    }    
    res = NotationFrom(s.substr(0,count), from);
    cout << "Десяткове представлення:\n";
    for (int i(res.size()-1); i > -1; --i)
        cout << res[i];
 
    //переводимо дробову частину в десяткову систему числення
    double dd = 0,
        base = 1;
    string ds = "", d = "";
    if (count < s.size())
    {
        s = s.substr(count+1, s.size()-count);
        FOR(i,0,s.size())
            dd += (base /= from) * (s[i] - '0');
        FOR(i,0,10)
        {
            ds += int(dd *= 10) + '0';
            dd -= int(dd);
        }
        Normalization(ds);
        if(ds.size()) cout << "." << ds << endl;
        d = NotationDiv(s, from, to);
    }
    
    //переводимо число в бажану систему числення
    cout << "\n\nПредставлення числа в системi з основою " << to << ":" << endl;
    res = NotationTo(res, to);
    s.clear();
    for (int i(res.size()-1); i > -1; --i)
        s += ( (res[i]/10) ? (res[i] - 10 + 'A') : (res[i] + '0') );
    s += '.' + d;
    Normalization(s);
 
    cout << s << endl << endl;
}
 
//функція для переведення числа в 10-ву систему числення------------------------
vector <int> NotationFrom(string s, int &from)
{
    vector <int> res, d, b;
    res.push_back(0);
    b.push_back(1);
    for (int i(s.size()-1); i > -1; --i)
    {
        d.clear();
        d = Mult(b, (isalpha(s[i])) ? (int(s[i] - 'A') + 10) : (int(s[i] - '0')));
        res = Sum(res, d);
        b = Mult(b, from);
    }
    return res;
}
 
//функція для переведення числа в систему числення з основою 2..36--------------
vector <int> NotationTo(vector <int> a, int &to)
{
    vector <int> res;
    int carry = 0;
    while (a.size() != 1 || (a.back() != 0 && a.size() == 1) )
    {
        a = Div(a, to, carry);
        res.push_back(carry);
    }
    return res;
}
 
//переведення дробової частини числа
string NotationDiv(string s, int &from, int &to)
{
    string res = "";
    double d = 0, base = 1;
    FOR(i,0,s.size())   
        d += (base /= from) * (s[i] - '0');
    FOR(i,0,10)
    {
        res += int(d *= to) + '0';
        d -= int(d);
    }
    return res;
}
 
//ділення довгого на коротке, повернення результуючого вектора на остачі--------
vector <int> Div(vector <int> a, int b, int &carry)
{
    carry = 0;
    for (int i = (a.size()-1); i > -1; --i)
    {
        long long cur = carry * base + a[i];
        a[i] = int (cur / b);
        carry = int (cur % b);
    }
    while (a.size() > 1 && a.back() == 0)
        a.pop_back();
    return a;
}
 
//множення довгого на коротке, повернення результуючого вектора-----------------
vector <int> Mult(vector <int> a, int n)
{
    int carry = 0;
    for (int i = 0, _n(a.size()); i < _n || carry; ++i)
    {
        if (i == a.size()) a.push_back(0);
        long long cur = carry + a[i] * n;
        a[i] = (int) cur % base;
        carry = (int) cur / base;
    }
    return a;
}
 
//додавання 2-ох довгих, повернення результуючого вектора-----------------------
vector <int> Sum(vector <int> a, vector <int> b)
{
    if (a.size() < b.size()) swap(a,b);
    int carry = 0;
    for (int i = 0, _n(a.size()); i < _n || carry; ++i)
    {
        if (i == a.size())
            a.push_back(0);
        if (i == b.size())
            b.push_back(0);
        long long cur = a[i] + b[i] + carry;
        a[i] = (int) cur % base;
        carry = (int) cur / base;
    }
    return a;
}
1
20.02.2010, 21:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2010, 21:58
Привет! Вот еще темы с ответами:

Написать рекурсивную функцию перевода целого числа из десятичной системы счисления в 9 систему счисления C++ - C++
Написать рекурсивную функцию перевода целого числа из десятичной системы счисления в 9-чную систему счисления.

С восьмеричной системы счисления в десятичную систему счисления - C++
Задание: Дана строка символов. Если он изображен целого числа в восьмеричной системе счисления, то перевести его в целое число в...

Перевод чисел из 16 системы счисления в 2 систему счисления - C++
Помогите составить программу для перевод чисел из 16 с/c в 2 c/c при условии,что программ может переводить и дробные числа.

системы счисления - C++
Помогите, пожалуйста. Необходимо написать программу, которая переводит числа из 16ой СС в 2ую и 8ую Числа: 9F40 ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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