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

Номер двоичного разряда - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Mac OS Timers http://www.cyberforum.ru/cpp-beginners/thread103781.html
Доброго времени суток. Есть ли какие-то средства(чистый С) для работы с таймерами под Мак(аналоги timer_create или SetTimer, возможно, мультимедийные таймеры)? Или все же придется писать свой?..
C++ Еще одна мизерная прога Нужно вывести на экран все делители заданного натурального числа n http://www.cyberforum.ru/cpp-beginners/thread103546.html
C++ try
Пользоваться tryем, представьте себе, начинаю. Может ли обработчик исключения получить указатель на его источник (функцию/операцию, в которой произошло исключение) или иную информацию о месте возникновения исключения? Можно ли в заголовке cathа указать два типа (для обработки исключений, возникающих в операциях с операндами разных типов)? Какие исключения отбрасывать throwем и что вернуть вторым...
Даны 3 числа A,B,C, которые вводятся с клавы. Если число А чётное то вывести сумму чисел А,В,С, иначе их произ C++
Итак: Даны 3 числа A,B,C, которые вводятся с клавы. Если число А чётное то вывести сумму чисел А,В,С, иначе их произведение.
C++ Cannot convert http://www.cyberforum.ru/cpp-beginners/thread103263.html
Прошу прощения за столь ламерский вопрос. При попытке запустить прогу вылетает сообщение: Unit1.cpp(15): E2034 Cannot convert 'char *' to 'char' Unit1.cpp(16): E2034 Cannot convert 'FILE *' to 'FILE' Unit1.cpp(17): E2034 Cannot convert 'int' to 'const void *' Unit1.cpp(17): E2342 Type mismatch in parameter '__ptr' (wanted 'const void *', got 'char') Unit1.cpp(17): E2034 Cannot convert...
C++ Как исключить из цикла числа содержащиеся в массиве Есть массив исключений Int massiv={0};В нем каждый раз разное количество элементов которые больше нуля. Нужно составить условие, при котором если число больше нуля и входит в массив исключений , то выполняется некое условие. Я написал код , когда сразу известно сколько элементов в массиве больше нуля Скажем таких элементов два for(i=1; i<52; i++){ if(i==massiv|| i==massiv){ break;} }Но... подробнее

Показать сообщение отдельно
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
14.03.2010, 09:49     Номер двоичного разряда
a_in_b.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
#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;
        else 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;
    int ok = (s[0] == '0'); //перевірка на наявність цілої частини
    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[0] == '.' ? "0" : "") << 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;
}

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);
}

Специально ничего не менял, что-бы сам разобрался что к чему..

Добавлено через 2 минуты
полсе перевода 2 2-ичную можеш перевести число в строку и пробежав по ней сказать сколько слева и справа стоит 1 или 0 (но этот вариант канает только при очень малых ограничениях, т.к. работать будет долго..)
 
Текущее время: 08:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru