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

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

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

Cравнить два числа, записанных в формате “<основание>^<экспонента>" - C++

17.11.2011, 21:45. Просмотров 627. Ответов 6
Метки нет (Все метки)

Помогите с программой, пожалуйста.
Не знаю как составить алгоритм к задаче такого типа:

Число назовем массивным, если оно записано в виде a^n, что означает возведение числа a в степень n. Вам требуется сравнить два массивных числа ab и cd, записанных в формате “<основание>^<экспонента>”.

Из двух заданных массивных чисел следует вывести большее.


Технические условия
Входные данные

Два массивных числа a и b в формате “<основание>^<экспонента>”. Известно, что 1 ≤ <основание>, <экспонента> ≤ 1000.

Выходные данные

Большее число среди a и b.

Например
Пример входных данных
Sample 1
3^100 2^150

Sample 2
1^1000 2^1

Пример выходных данных
Sample 1
3^100

Sample 2
2^1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2011, 21:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Cравнить два числа, записанных в формате “<основание>^<экспонента>" (C++):

Два двузначных числа, записанных подряд, образуют четырехзначное число, которое нацело делится на их произведение. Найти все такие числа - C++
Товарищи катятки, запоролся на простой задаче: Два двузначных числа, записанных подряд, образуют четырехзначное число, которое нацело...

Сравните два числа A и B. Задан два целых неотрицательных числа A и B - C++
Сравните два числа A и B. Задан два целых неотрицательных числа A и B (A, B &lt;= 1010000) каждое в своей строке. Найти разность двух...

Cравнить элементы двух массивов - C++
даны два массива целых чисел одинакого размера.сравнить элементы двух массивов и сохранить результаты в третий массив в соответствующей...

Создать два класса: Date (дата в формате ДД.ММ.ГГ) и Performer - C++
Нужно создать два класса. Первый Date (дата в формате ДД.ММ.ГГ), второй Performer. Объекты второго класса имеют поля 1)имя (char) 2)фамилия...

Cравнить число перестановок для различных сортировок - C++
Напишите программу, которая сравнивает число перестановок элементов при использовании сортировки «пузырьком», методом выбора и алгоритма...

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

6
greshnikk
31 / 31 / 0
Регистрация: 05.11.2008
Сообщений: 162
17.11.2011, 21:56 #2
C++
1
max(pow(a,b),pow(c,d))
пробовали ?
1
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
18.11.2011, 09:18 #3
greshnikk, и что будет при
C++
1
std::max(pow(1000.0, 1000.0), pow(999.0, 1000.0));
?

Добавлено через 19 секунд
Тут придётся использовать длинную арифметику.
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
18.11.2011, 10:24 #4
silent_1991, абсолютно прав (:

http://e-maxx.ru/algo/big_integer в помощь

Решил вспомнить как это:

код
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
/* 
 *  Author: Kovtun Ruslan
 *          TFTM © 2011
 */
 
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <limits>
#include <iomanip>
#include <ctime>
#include <cmath>
 
using namespace std;
 
typedef __int64 LL;
typedef std::vector<int> VI;
typedef std::vector<VI> VVI;
typedef std::pair<int,int> PII;
typedef std::pair<double,double> PDD;
 
#define FOR(i,a,b) for (int i(a), _n(b); i < _n; ++i)
#define FORR(i,b,a) for (int i(b), _n(a); i >= _n; --i)
#define ALL(a) a.begin(), a.end()
#define MP(a,b) make_pair(a,b)
 
const LL base = 1000*1000*1000;
 
VI &operator *= (VI &a, VI b)
{
    VI res(a.size() + b.size(), 0);
    for (int i(0); i < a.size(); ++i)
        for (int j(0), carry(0); j < b.size() || carry; ++j)
        {
            LL cur = res[i+j] + a[i] * 1ll * (j < (int)b.size() ? b[j] : 0) + carry;
            res[i+j] = int (cur % base);
            carry = int (cur / base);
        }
    while (!res.back() && res.size() > 1) res.pop_back();
    return a = res;
}
 
VI BinPow(int a, int n)
{
    VI res(1, 1), b(1, a);
    while (n) n & 1 ? (--n, res *= b) : (n >>= 1, b *= b);
    return res;
}
 
ostream &operator << (ostream &out, VI a)
{
    out << a.back();
    for (int i(a.size()-2); i > -1; --i) 
        out << setfill('0') << setw(9) << a[i];
    return out;
}
 
int main(){
        VI res = BinPow(2, 64);
    cout << res << endl;
}


Добавлено через 18 минут
Подумал, что быстрота не так важна, решил сделать более читабельный вывод:
код
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
/* 
 *  Author: Kovtun Ruslan
 *          TFTM © 2011
 */
 
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <limits>
#include <iomanip>
#include <ctime>
#include <cmath>
 
using namespace std;
 
typedef __int64 LL;
typedef std::vector<int> VI;
typedef std::vector<VI> VVI;
typedef std::pair<int,int> PII;
typedef std::pair<double,double> PDD;
 
#define FOR(i,a,b) for (int i(a), _n(b); i < _n; ++i)
#define FORR(i,b,a) for (int i(b), _n(a); i >= _n; --i)
#define ALL(a) a.begin(), a.end()
#define MP(a,b) make_pair(a,b)
 
const LL base = 1000;//*1000*1000;
 
VI &operator *= (VI &a, VI b)
{
    VI res(a.size() + b.size(), 0);
    for (int i(0); i < a.size(); ++i)
        for (int j(0), carry(0); j < b.size() || carry; ++j)
        {
            LL cur = res[i+j] + a[i] * 1ll * (j < (int)b.size() ? b[j] : 0) + carry;
            res[i+j] = int (cur % base);
            carry = int (cur / base);
        }
    while (!res.back() && res.size() > 1) res.pop_back();
    return a = res;
}
 
VI BinPow(int a, int n)
{
    VI res(1, 1), b(1, a);
    while (n) n & 1 ? (--n, res *= b) : (n >>= 1, b *= b);
    return res;
}
 
ostream &operator << (ostream &out, VI a)
{
    out << a.back() << (a.size() > 1 ? "," : "");
    for (int i(a.size()-2); i > -1; --i) 
        out << setfill('0') << setw(3) << a[i] << (i ? "," : "");
    return out;
}
 
int main(){
        VI res = BinPow(2, 31);
    cout << res << endl;
}

Здесь просто по 3 цифры идет, так проще комы расставит (:
1
oldoldspice
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 20
05.08.2017, 14:30  [ТС] #5
Большое спасибо за ответы!
0
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,632
Записей в блоге: 3
Завершенные тесты: 1
05.08.2017, 16:44 #6
oldoldspice, медленное же у Вас соединение.
1
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,384
Завершенные тесты: 1
05.08.2017, 17:57 #7
Думаю, можно попробовать и без длинной арифметики путем приведения к одному основанию (стандартно к e):
ab=eb*ln(a)
cd=ed*ln(c)
т.о. если b*ln(a)>d*ln(c), то первое число больше второго
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2017, 17:57
Привет! Вот еще темы с ответами:

Задать два числа как два массива и потом выполнить сложение, умножение и деление - C++
Здравствуйте! Суть задачи в следующем: Нужно задать два числа как два массива и потом выполнить сложение, умножение и деление с помощью...

Чтение числа в формате scientific - C++
Есть ли в C++ функции, позволяющие прочитать из файла число, записанное в научном формате (типа 1.1497e+01)? Если нет (я что-то не...

Представление числа в разном формате - C++
как можно представить числа, например 2, в формате 2.0 или 2.00, нужна для предсталения числа в виде таблицы

Как выводить числа двухзначном формате? - C++
Допустим есть число 9 или 15. Я хочу для вывода написать 09 или 15. Есть ли готовая команда, чтобы это сделать? Неудобно когда время...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
05.08.2017, 17:57
Ответ Создать тему
Опции темы

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