Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
31 / 1 / 0
Регистрация: 07.01.2016
Сообщений: 44
1

Найти разность между неотрицательными числами А и В

06.10.2016, 07:26. Показов 4833. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
задача №143 a-b на асmp.

A-B
(Время: 1 сек. Память: 16 Мб Сложность: 44%)

Требуется найти разность между неотрицательными числами А и В.
Входные данные

Во входном файле INPUT.TXT в двух строках записаны два неотрицательных целых числа A и B, не превышающие 101000.
Выходные данные

В выходной файл OUTPUT.TXT выведите значение A-B.

НУЖНА ПОМОЩЬ!

Кликните здесь для просмотра всего текста

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
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#define o cout<<
#define in cin>>
#define fi for(int i=0;
using namespace std;
 
int l1, l2, a[110], b[110], L, c[111];
string p1="", p2="";
 
int main (){
    in p1;
    in p2;
    l1=p1.size();
    l2=p2.size();
    L=max(l1,l2);
    int j=l1-1;
    fi i<l1;i++){
        a[j]=p1[i]-48;
        j--;
    }
    j=l2-1;
    fi i<l2;i++){
        b[j]=p2[i]-48;
        j--;
    }
    fi i<L;i++){
       c[i]=a[i]-b[i];
    }
 
    for (int i=0;i<L;i++)
        if (c[i]<0){
            c[i+1]--;
            c[i]=(c[i]+10);
        }
    while (L > 1 && c[L-1]==0)
        L--;
for(int i=L-1;i>-1;i--)
    o c[i];
return 0;
}
прошу не использовать map и вписываться в рамки тех библеотек которые подключены выше!
Миниатюры
Найти разность между неотрицательными числами А и В  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2016, 07:26
Ответы с готовыми решениями:

Как взять разность по модулю между двумя числами int?
Суть в теме: &quot;Как взять разность по модулю между двумя числами int?&quot;. Заранее спасибо :)

Вывести минимальную по абсолютной величине разность между соседними числами.
Ввести 10 целых чисел, вывести минимальную по абсолютной величине разность между соседними числами....

Найти разность между наибольшим и наименьшим числом
Найти разность между наибольшим и наименьшим числом. Числа задаются во входном потоке по одному...

Найти разность между наибольшим и наименьшим числом
4. Найти разность между наибольшим и наименьшим числом. ТУ. Числа задаются во входном потоке по...

7
10 / 11 / 7
Регистрация: 11.05.2016
Сообщений: 113
06.10.2016, 09:41 2
game1progg, посмотри взаимодействия с файлами c++(через поток или библиотеку stdio.h), делается все просто, объявляешь файловую переменную, через цикл можешь считывать из нее числа, соответственно, если в нем два числа, то считать и найти разность и через вторую файловую переменную для выхода записать, даже меньше 1 сек должно быть. Для уменьшения потребления памяти, можешь переобъявить файловую переменную после считывания через указатель
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
06.10.2016, 11:12 3
А что делает эта программа, которая приведена автором в 1 сообщении?

Добавлено через 11 минут
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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
FILE *RF, *WF;
char Bufer[7];
int A, B, C;
 
if((RF = fopen("Input.txt", "r")) == NULL)
{
    cout << "Ne mogu otkrit file Input.txt.";
    getch();
    return 1;
}
if((WF = fopen("Output.txt", "w")) == NULL)
{
    cout << "Ne mogu otkrit file Output.txt.";
    getch();
    return 1;
}
fgets(Bufer, 7, RF);
A = atoi(Bufer);
cout << "A=" << A << endl;
fgets(Bufer, 7, RF);
B = atoi(Bufer);
cout << "B=" << B << endl;
 
C=A-B;
fprintf(WF, "%d", C);
 
fclose(RF);
fclose(WF);
getch();
return 0;
}
//---------------------------------------------------------------------------
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
06.10.2016, 13:08 4
Цитата Сообщение от game1progg Посмотреть сообщение
Сложность: 44%)
Я бы столько не дал.
Кстати, на подобных сайтах можно пользоваться стандартным потоком вывода, то есть std::cout и std::cin.

Добавлено через 2 минуты

Не по теме:

На python длинная арифметика из коробки, решил вот так:

Python
1
2
3
a = int(input());
b = int(input());
print( a - b );
:D



Добавлено через 1 час 18 минут
Короче вот что удалось сделать, но не все тесты проходит( а иногда даже падает, поэтому возможно, что где-то UB ), а мне уже лень доделывать, разбирайтесь дальше сами.

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
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
111
/////////////////////////////////////////////////////////////////////
// задача №143 a-b на асmp.
 
// A-B
// (Время: 1 сек. Память: 16 Мб Сложность: 44%)
 
// Требуется найти разность между неотрицательными числами А и В.
// Входные данные
 
// Во входном файле INPUT.TXT
// в двух строках записаны два неотрицательных целых числа A и B, 
// не превышающие 101000.
 
// Выходные данные
// В выходной файл OUTPUT.TXT выведите значение A-B. 
/////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////
int ctoi( char c )
{
    return c - '0';
}
/////////////////////////////////////////////////////////////////////
std::string remove_null_first( std::string str )
{
    while( str[0] == '0' )
    {
        str.erase( 0, 1 );
    }
    return str;
}
/////////////////////////////////////////////////////////////////////
std::string difference( std::string fst, std::string snd )
{
    size_t diff = fst.size() - snd.size();
    for( 
            size_t i = fst.size() - 1; 
            i >= diff;
            --i
       )
    {
        if( fst[i] - snd[i - diff] >= 0 )
        {
            fst[i] -= ( ctoi( snd[i - diff] ) );
            snd[i - diff] = 0;
        }
        else
        {
            fst[i - 1] -= 1;
            fst[i] = (fst[i] - ctoi( snd[i - diff] )) + 10;
        }
    }
    return remove_null_first( fst );
}
/////////////////////////////////////////////////////////////////////
std::string operator-( std::string fst, std::string snd )
{
    //1 - равны
    //2 - первое больше
    //3 - второе больше
    int longest =
        fst.size() == snd.size() 
      ? 1 : fst.size() > snd.size() 
          ? 2 : 3;
          
    if( longest == 1 )
    {
        for( auto i = 0u; i < fst.size(); ++i )
        {
            if( fst[i] > snd[i] )
            {
                longest = 2;
                break;
            }
            if( snd[i] > fst[i] )
            {
                longest = 3;
                break;
            }
        }
    }
    
    if( longest == 2 )
    {
        return difference( fst, snd );
    }
    else if( longest == 3 )
    {
        return '-' + difference( snd, fst );
    }
    else
    {
        return "0";
    }
}
/////////////////////////////////////////////////////////////////////
int main()
{
    std::string a{};
    std::string b{};
    std::cin >> a >> b;
    if( a.size() < 10 && b.size() < 10 )
    {
        std::cout << stoi(a) - stoi(b);
    }
    else
    {
        std::cout << (a - b);
    }
}
0
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
06.10.2016, 14:39 5
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
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
#include <iostream>
 
const size_t LEN = 101000+1;
void print_num(size_t len, char *a, bool minus) {
    if(minus) std::cout << '-';
    a += len - 1;
    for(int i = LEN, ok = 0; i > 0; --i, --a)
        if(ok || *a){
            char n, m;
            __asm{
                ; // распакуем цифры
                mov ebx, a
                mov al, byte ptr [ebx]
                mov ah, al
                shr ah, 4
                and ax, 00f0fh
                mov n, ah
                mov m, al
            }
            if(n)
                std::cout << char(n + '0');
            std::cout << char(m + '0');
            ok = 1;
        }
    std::cout << std::endl;
}
bool sub(size_t len, const char *a, const char *b, char *c) {
    bool minus = false;
    /*вычитание*/
    __asm{
        mov esi, a
        mov edi, b
        mov edx, c
        xor ebx, ebx
        clc                  ; //очищаем флаг CF
        mov ecx, len
    l : mov al, byte ptr[esi + ebx]    ; //берем цифру из a
        sbb al, byte ptr[edi + ebx]    ; //вычитаем цифру из b с учетом переноса
        das                            ; //восстановление двоично-десятичной записи 
        mov byte ptr[edx + ebx], al    ; //записываем результат в c
 
        inc ebx              ; //индекс
        loop l               ; //переход к обработке следующей пары цифры
 
        jnc quit
        mov minus, 1         ; //знак полученного числа
        ; //найдем модуль числа
        mov edi, c
        xor ebx, ebx
        xor al, al
        clc                  ; //очищаем флаг CF
        mov ecx, len        
    ll: sbb al, byte ptr[edi + ebx]; //вычитаем цифру из b с учетом переноса
        das                        ; //восстановление двоично-десятичной записи 
        mov byte ptr[edi + ebx], al; //записываем результат в c
 
        mov al, 0
        inc ebx              ; //индекс
        loop ll
    quit:
    }
    return minus;
}
void get_num(size_t len, char *a) {
    /*собираем число в конце массива*/
    char ch;
    size_t i = len - 1; //на конце запасной нулевой элемент, чтобы в блоке asm обрабатывать по дав байта в цикле
    while(i && std::cin.get(ch) && ch != '\n') a[--i] = ch - '0';
        
    __asm{
                ; // сжимаем к левому краю (две цифры в один байт)
                mov esi, a
                mov edi, esi
                add edi, i
 
                mov ecx, len               ; // количество байт в двоично десятичном числе
                sub ecx, i
                shr ecx, 1
            l : mov al, byte ptr[edi + 1]  ; // упаковываем две цифры в один байт
                shl al, 4
                or  al, byte ptr[edi]
                mov byte ptr[edi], 0       ; // стираем цифры
                mov byte ptr[edi + 1], 0
                mov byte ptr[esi], al      ; // записываем упакованные
 
                inc esi
                add edi, 2
 
                loop l          
    }
}
int main() {
    char a[LEN] = {0}, b[LEN] = {0}, c[LEN] = {0};
    
    /*забираем числа*/
    get_num(LEN, a);
    get_num(LEN, b);
    
    
    bool minus = sub(LEN, a, b, c);
 
    /*печатаем результат*/
    print_num(LEN, c, minus);
    
    std::system("pause");
 
    return 0;
}
Добавлено через 28 секунд
Только на ведре
0
31 / 1 / 0
Регистрация: 07.01.2016
Сообщений: 44
13.10.2016, 11:50  [ТС] 6
а можно без "ВЕДРА"?
я просто не знать что это
0
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
13.10.2016, 12:01 7
game1progg, разве ты еще не сдал эту задачу? столько времени прошло уже. Ведро - это Windows. Конечно на олимпиадных сайтах другая ось (операционная система).
0
31 / 1 / 0
Регистрация: 07.01.2016
Сообщений: 44
15.10.2016, 06:24  [ТС] 8
ну я даю, ведро...
ну мне ваш код не ясен, например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
__asm{
                ; // сжимаем к левому краю (две цифры в один байт)
                mov esi, a
                mov edi, esi
                add edi, i
 
                mov ecx, len               ; // количество байт в двоично десятичном числе
                sub ecx, i
                shr ecx, 1
            l : mov al, byte ptr[edi + 1]  ; // упаковываем две цифры в один байт
                shl al, 4
                or  al, byte ptr[edi]
                mov byte ptr[edi], 0       ; // стираем цифры
                mov byte ptr[edi + 1], 0
                mov byte ptr[esi], al      ; // записываем упакованные
 
                inc esi
                add edi, 2
 
                loop l          
    }
особенно здесь!
насколько я понял это struct или я не прав?

Добавлено через 56 секунд
Т.К. я ещё это не изучал

Добавлено через 42 секунды
давайте я выложу то что я знаю...

Добавлено через 3 минуты
C++
1
2
#define ... ... //простенький
#include <cmath>
C++
1
2
3
4
5
6
7
8
using namespace std; //обезателен
sort();
stable_sort();
vector
cin>> 
cout<<
printf();
scanf();
и ещё dfs/bfs.
вроде всё.

Добавлено через 57 секунд
а да функции и рекурсию забыл написать
0
15.10.2016, 06:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2016, 06:24
Помогаю со студенческими работами здесь

1.Дан файл, компоненты которого являются действительными числами. Найти разность первой и последней компонент файла
1.Дан файл, компоненты которого являются действительными числами. Найти разность первой и последней...

Найти разность между наименьшим и наибольшим членом последовательности
Даны натуральные числа а1,а2,а3.. Признак конца последовательности &quot;11&quot;. Нужно найти разность между...

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

Найти разность между максимальным и минимальным значениями массива
Помогите пожалуйста реализовать данные задачи 1 Дан массив A из 10 вещественных чисел со знаком....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru