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

Вывести последовательность из цифр огромного числа - C++

Восстановить пароль Регистрация
 
Pjeroo
Землянин
 Аватар для Pjeroo
33 / 33 / 12
Регистрация: 15.01.2013
Сообщений: 313
11.09.2013, 13:16     Вывести последовательность из цифр огромного числа #1
Задание во вложении.

Собственно код:
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
#include <iostream>
#include <math.h>
 
using namespace std;
double factorial(int to);
double exponential(int to, int basis);
 
int main()
{
    int i=1;
    double mantiss, whole;
 
    double toOutput = exponential(40, 2);
    
    cout << toOutput << '\n';
 
    while(true)
        {
            toOutput = toOutput / 10;
            mantiss = modf(toOutput, &whole);
            cout << (mantiss * 10) << '\n';
            toOutput = toOutput - mantiss;
            if(toOutput<1)
                break;
            i++;
        }
    cout << '\n' << i << '\n';
    return 0;
}
double factorial(int to)
{
    double factor = 1;
    for (int i = 1; i <= to; i++)
    {
        factor = factor * i;
    }
    return factor;
}
 
double exponential(int to, int basis)
{
    double expon = 1;
    for (int i = 1; i <= to; i++)
    {
        expon *= basis;
    }
    return expon;
}
Работает правильно только до 12 знака, затем идут помехи погрешности, вместо 7 - 7.0001, вместо 6 - 6.00006. Знаю, что это из-за особенности хранения чисел с плавающей точкой, но как можно сделать по другому, чтобы было точно?
В коде там считается 2^40 и уже есть погрешность, а по заданию надо 100! - 2^100, а это ~9 * 10^157, там только 16 значащих цифр отображается, а остальное заполняется нулями. Что делать?
Миниатюры
Вывести последовательность из цифр огромного числа  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 13:16     Вывести последовательность из цифр огромного числа
Посмотрите здесь:

Определить, есть ли в записи натурального числа n последовательность из k одинаковых цифр C++
Тип для хранения огромного числа. C++
C++ Вводится последовательность из N целых чисел. Найти среднее арифметическое его цифр (функцией оформить определения среднего арифметического цифр числа
Дано натуральное число N. Найти и вывести все числа в интервале от 1 до N-1, у которых произведение цифр совпадает с произведением цифр данного числа C++
C++ Классы. Вывести значение числа цифр в дробной части числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
11.09.2013, 13:21     Вывести последовательность из цифр огромного числа #2
использовать только целые числа
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 13:23     Вывести последовательность из цифр огромного числа #3
Используй длинную арифметику (гугл в помощь), например GMP или что-нибудь аналогичное.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
11.09.2013, 13:57     Вывести последовательность из цифр огромного числа #4
по моему лучше для начала написать класс BigIntegers

Добавлено через 12 минут
вот кстати то что сходу удалось найти Спроектировать и реализовать класс BigInt

Добавлено через 4 минуты
а по фаулеру лучше сначала написать unit test а потом писать сам класс
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.09.2013, 14:48     Вывести последовательность из цифр огромного числа #5
Еще можно посмотреть в сторону Boost.Multiprecision. Пример для факториала :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
 
namespace mp = boost::multiprecision;
 
mp::cpp_int fact(unsigned n)
{
   mp::cpp_int res = 1;
   for (unsigned i = 2; i <= n; ++i)
      res *= i;
   return res;
}
 
int main()
{
   std::cout << "5!   = " << fact(5) << std::endl;
   std::cout << "100! = " << fact(100) << std::endl;
   std::cout << "1000! = " << fact(1000) << std::endl;
 
   std::cout<<'\n';
   return 0;
}
Yandex
Объявления
11.09.2013, 14:48     Вывести последовательность из цифр огромного числа
Ответ Создать тему
Опции темы

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