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

Ошибка в реализации длинной арифметики - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Очередь http://www.cyberforum.ru/cpp-beginners/thread961383.html
Дан файл со словами. За один проход файла создать 2 дополнительных файла. В первый записать самые маленькие слова, во второй - самые большие (то есть остальные). Будем считать что маленькое слово - это слово до 4 символов, большое слово - больше 4 символов. Слова в новых файлах должны быть расположены в таком порядке как были расположены в исходном файле. В создании программы нужно использовать...
C++ Как сравнить элемент двумерного массива? if (map != map) массив char http://www.cyberforum.ru/cpp-beginners/thread961380.html
что не так C++
написал код там ошибка)) но а смысл правильный)) помогите плиз что не так)) вот задача Даны целые числа k, m, действительные числа х, у, z. При k<m^2, k=m^2 или k>m^2 заменить модулем соответственно, значения x, у или z, а два других значения уменьшить на 0.5. #include <iostream> #include <math> void main(void)
C++ Записать в файл последовательность строк. Самую короткую строку переписать в обратном порядке
Помогите новичку написать программу, а то у нас требуют объяснять не кто хочет!
C++ разбиение русских слов на слоги http://www.cyberforum.ru/cpp-beginners/thread961370.html
очень много аналогичных тем, но решений найти так и не смог
C++ Проблемы сохранения структуры в файл Здравствуйте, уважаемые программисты! Есть вот такая вот структура: struct Data { float x1,x2,x3,x4,x5,x6,x7, x; float y1,y2,y3,y4,y5,y6,y7, y; float k; } ; Data data; подробнее

Показать сообщение отдельно
nuts23
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 30

Ошибка в реализации длинной арифметики - C++

24.09.2013, 18:51. Просмотров 364. Ответов 6
Метки (Все метки)

Здравствуйте.
Я скопировал с e-maxx'а и объединил всё в одну программу:
C++ (Qt)
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
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
const int base = 1000*1000*1000;
 
void sum(vector<int> *a, vector<int> *b) //Прибавляет к числу a число b и сохраняет результат в a
{
    int carry = 0;
    for (size_t i=0; i<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;
    }
    while (a->size() > 1 && a->back() == 0)
        a->pop_back();
}
void vich(vector<int> *a, vector<int> *b) //Отнимает от числа a число b число (a >= b) и сохраняет результат в a
{
    int carry = 0;
    for (size_t i=0; i<b->size() || carry; ++i)
    {
        (*a)[i] -= carry + (i < b->size() ? (*b)[i] : 0);
        carry = (*a)[i] < 0;
        if (carry)
          (*a)[i] += base;
    }
    while (a->size() > 1 && a->back() == 0)
        a->pop_back();
}
void umn_kor(vector<int> *a, int b) //Умножает длинное a на короткое b (b < base) и сохраняет результат в a
{
    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();
}
void delen(vector<int> *a, int b) //Делит длинное a на короткое b (b < base), частное сохраняет в a, остаток в carry
{
    int carry = 0;
    for (int i=(int)a->size()-1; i>=0; --i) {
        long long cur = (*a)[i] + carry * 1ll * base;
        (*a)[i] = int (cur / b);
        carry = int (cur % b);
    }
    while (a->size() > 1 && a->back() == 0)
        a->pop_back();
}
int main()
{
    vector<int> a;
    vector<int> b;
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    char s[10000];
    gets(s);
    // чтение
    for (int i=(int)strlen(s); i>0; i-=9)
    {
        s[i] = 0;
        a.push_back (atoi (i>=9 ? s+i-9 : s));
    }
    //лидирующие нули
    while (a.size() > 1 && a.back() == 0)
        a.pop_back();
    gets(s);
    for (int i=(int)strlen(s); i>0; i-=9)
    {
        s[i] = 0;
        b.push_back (atoi (i>=9 ? s+i-9 : s));
    }
    while (b.size() > 1 && b.back() == 0)
        b.pop_back();
    //вывод
    sum(&a, &b);
    printf ("%d", a.empty() ? 0 : a.back());
    for (int i=(int)a.size()-2; i>=0; --i)
        printf ("%09d", a[i]);
    printf("\n");
    vich(&a, &b);
    printf ("%d", a.empty() ? 0 : a.back());
    for (int i=(int)a.size()-2; i>=0; --i)
        printf ("%09d", a[i]);
    printf("\n");
    umn_kor(&a, 100);
    printf ("%d", a.empty() ? 0 : a.back());
    for (int i=(int)a.size()-2; i>=0; --i)
        printf ("%09d", a[i]);
    printf("\n");
    delen(&a, 1000);
    printf ("%d", a.empty() ? 0 : a.back());
    for (int i=(int)a.size()-2; i>=0; --i)
        printf ("%09d", a[i]);
    return 0;
}
Программа при
123456789
1000
возвращает (сумму, разность, произведение, частное)
123457789
123456789
12345678900
12345678
Проблема в том, что она делит и умножает только на b (второе число) <= 100. Т.е. при b = 10^3 или b = 10^6 она всё равно умножает и делит на 100. Если b <= 100, то она умножает на b.
Подскажите, пожалуйста, в чём проблема.
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru