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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
iggy fourty-one
0 / 0 / 0
Регистрация: 02.06.2011
Сообщений: 8
#1

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

19.06.2011, 23:36. Просмотров 2275. Ответов 6
Метки нет (Все метки)

задание было вычислить 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();
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2011, 23:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Длинная арифметика. сумма факториалов. (C++):

Длинная арифметика, сумма чисел - C++
Входной файл содержит набор целых десятичных чисел, каждое из которых не превышает 30 десятичных цифр. Необходимо вычислить сумму этих...

Длинная арифметика: сумма двух строк - C++
int One = strlen(BufOne); int Two = strlen(BufTwo); int MaxL = max(One, Two); char *Result = (char*)malloc(MaxL); int a; double...

Длинная арифметика - C++
Доброго времени, в задачке по криптоанализу столкнулся с недостатком размерности типов в с++. В процессе поиска нашел ряд решений: 1)...

Длинная арифметика - C++
Как сделать типы длинных чисел, например, знаковое 256-ти битное целое и 256-ти битное вещественное с 224-х битной мантиссой и 32-х битным...

Длинная арифметика - C++
Ребята,объясните как решить задачу , напишите хоть часть кода. Пусть даны числа a , b . Найти a+b, если a и b не больше чем 10 в...

длинная арифметика - C++
решите задачку: пользователь вводит 2 больших числа (числа от -1*2^127 до 1*2^127-1). Написать программу для суммирования таких чисел.

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

Добавлено через 2 минуты
big integer
1
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.06.2011, 03:21 #5
длинная арифметика
0
diagon
Higher
1929 / 1195 / 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;
}
2
Fletcher35
0 / 0 / 0
Регистрация: 15.10.2011
Сообщений: 6
15.10.2011, 21:11 #7
спасибо, мой вывод: легче решить на Питоне)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2011, 21:11
Привет! Вот еще темы с ответами:

Длинная арифметика - C++
Мне дали задание с вычеслениями длинной арифметики. С мысл в том что там все действия происходят с символьными масивами. Я так и не...

Длинная арифметика - C++
:senor: Здраствуйте, пишу модуль длинной математики. В принципе, работоспособность у него положительная. Но в силу моей неопытности меня...

Длинная арифметика - C++
Помогите реализовать длинную арифметику #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main(){ int a; string...

Длинная арифметика - C++
Доброго времени суток. Подскажите, как реализовать деление с остатком двух чисел, находящихся в двусвязном списке, узлы которого - цифры....


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

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

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