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

Длинная арифметика. сумма факториалов. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
iggy fourty-one
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 8
19.06.2011, 23:36     Длинная арифметика. сумма факториалов. #1
задание было вычислить 1\1! +1\2! + ... + 1/n!
при n>10
ответ представить в виде несократимой дроби
тип инт разрешает в данном случае, не более 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
#include <iostream>
#include <locale.h>
#include <conio.h>
using namespace std;
 
//Тип данных __int64 самый большой из мне известных,
//поэтому в него можно уложить даже 20!
__int32 gcd(__int32 a,__int32 b)//Функция нахождения НОД по алгоритму Эвклида
{
__int32 c;
while(b) 
{
c=a%b;
a=b;
b=c;
}
return a;
}
 
void Summ(int n,__int32 &ch,__int32 &zn)//Сама функция считающая сумму
{
for(int i=2;i<=n;i++)
{
ch=ch*i+1; //Принцип работы прост, чтобы получить новый i-тый эл-т суммы 
zn=zn*i; //приводим дроби к общему знаменателю, домножив числитель и 
//знаменатель на i,а затем просто сложим дроби
}
__int32 nod=gcd(ch,zn);//Найдем наибольший общий делитель
ch=ch/nod;//И сократим на него числитель 
zn=zn/nod;//со знаменателем
}
 
void main()
{
setlocale(LC_ALL,"rus");//Установка кодировки вывода
int n;//Колличество суммируемых элементов
__int32 ch=1;//Числитель
__int32 zn=1;//и знаменатель, инициализируем их 
//первым членом ряда, и будем к нему прибавлять все остальные
 
cout<<"Vvedite chislo chlenov ryada 1/n! : ";
cin>>n;
 
Summ(n,ch,zn);
cout<<"\nOtvet, summa pervih "<<n<<" chlenov ryada ravna: "<<ch<<"/"<<zn<<"\n";
 
getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2011, 23:36     Длинная арифметика. сумма факториалов.
Посмотрите здесь:

Длинная арифметика. C++
Длинная арифметика C++
C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2011, 23:37     Длинная арифметика. сумма факториалов. #2
Цитата Сообщение от iggy fourty-one Посмотреть сообщение
мне подсказали что нужно числа представить в виде массивов, и только тогда оперировать ими. Я просто не могу представить как это сделать..
умножать в столбик на бумаге умеете? вот и реализуйте это
iggy fourty-one
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 8
19.06.2011, 23:41  [ТС]     Длинная арифметика. сумма факториалов. #3
Цитата Сообщение от Maxwe11 Посмотреть сообщение
умножать в столбик на бумаге умеете? вот и реализуйте это
умножать конечно умею, но как задать массив, из цифр, чтобы вмещал в себя огромные значения? и в какое место поставить?
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
20.06.2011, 00:44     Длинная арифметика. сумма факториалов. #4
каждую цифру текущего числа храните в массиве, только Ваше число будет перевернуто. Т.е. в NumberArray [ 0 ] будут храниться младший разряд числа.

Добавлено через 2 минуты
big integer
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.06.2011, 03:21     Длинная арифметика. сумма факториалов. #5
длинная арифметика
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.06.2011, 07:50     Длинная арифметика. сумма факториалов. #6
Есть готовый код, на acmp проходит все тесты.
Алгоритмы взяты с сайта, ссылка на который приведена в посте #4
P.S. только он вычисляет 1!+2!+3!..+n!
Можете исправить под себя либо взять какие-либо функции.
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 <stdio.h>
#include <iostream>
#include <sstream>
#include <vector>
#define base 1000000000
void writelong(std::vector<int> vec){ //вывод длинного числа
    printf ("%d", vec.empty() ? 0 : vec.back());
    for (int i=(int)vec.size()-2; i>=0; --i)
        printf ("%09d", vec[i]);
}
std::vector<int> smult(std::vector<int> a, int b){//умножение длинного числа на короткое
    int carry = 0;
    for (size_t i=0; i<a.size() || carry; ++i) {
        if (i == a.size())
            a.push_back (0);
        long long cur = carry + a[i] * 1ll * b;
        a[i] = int (cur % base);
        carry = int (cur / base);
    }
    while (a.size() > 1 && a.back() == 0)
        a.pop_back();
    return a;
}
std::vector<int> fact(std::vector<int> a, int b){//длинный факториал
    for (int i = 1; i <= b; i++)
        a=smult(a,i);
    return a;
}
std::vector<int> sum(std::vector<int> a, std::vector<int> b){//длинная сумма
    int carry = 0;
    for (size_t i=0; i<std::max(a.size(),b.size()) || carry; ++i) {
        if (i == a.size())
            a.push_back (0);
        a[i] += carry + (i < b.size() ? b[i] : 0);
        carry = a[i] >= base;
        if (carry)  a[i] -= base;
    }
    return a;
}
int main(){
    std::vector<int> a(1,0),b(1,1);
    int N;
    std::cin >> N;
    for (int i = 1; i <= N; i++)
        a=sum(a,fact(b,i));
    writelong(a);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2011, 21:11     Длинная арифметика. сумма факториалов.
Еще ссылки по теме:

Длинная арифметика C++
C++ Длинная арифметика С++
Длинная арифметика: сумма двух строк C++

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

Или воспользуйтесь поиском по форуму:
Fletcher35
0 / 0 / 0
Регистрация: 15.10.2011
Сообщений: 6
15.10.2011, 21:11     Длинная арифметика. сумма факториалов. #7
спасибо, мой вывод: легче решить на Питоне)
Yandex
Объявления
15.10.2011, 21:11     Длинная арифметика. сумма факториалов.
Ответ Создать тему
Опции темы

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