Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Marina91
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 13
#1

Длинная арифметика: операция сравнения двух чисел (A >= B) - C++

27.02.2011, 08:28. Просмотров 1372. Ответов 15
Метки нет (Все метки)

Привет всем! помогите пожалуйста кодом.
Необходимо реализовать операцию сравнения двух длинных чисел A>=B
Заранее спасибо
http://www.cyberforum.ru/cpp-beginners/thread1623762.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 08:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Длинная арифметика: операция сравнения двух чисел (A >= B) (C++):

Сложение двух чисел (длинная арифметика)
Нужно реализовать длинную арифметику (сложение двух больших чисел), но на экран...

Длинная арифметика: умножение двух длинных чисел
Всем привет! Снова к Вам за помощью. Алгоритм умножения двух длинных чисел:...

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

Длинная арифметика. Умножение двух длинных чисел.
Есть 2 числа, храняющиеся в int векторах, нужна функция, которая возвращает их...

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

15
FroL
61 / 49 / 6
Регистрация: 07.01.2010
Сообщений: 307
27.02.2011, 09:26 #2
Если число лежит в диапазоне от 0 до 4 294 672 295 то:
C++
1
2
3
4
5
6
7
long a, b;
cout<<"Введите первое число: "<<endl;
cin>>a;
cout<<"Введите второе число: "<<endl;
cin>>b;
if(a >= b) cout<<"a больше b"<<endl;
else cout<<"a меньше b"<<endl;
1
igorrr37
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
27.02.2011, 10:07 #3
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
#include<stdio.h>
#include<string.h>
 
int GreatEq(const char *a, const char* b){
    if(strlen(a)<strlen(b)) return 0;
    else if(strlen(a)>strlen(b)) return 1;
    else {
        do{
            if(*a<*b) return 0;
        }while(a++, *b++);
        return 1;
    }
}
 
int main (void){
    char a[100], b[100];
    printf("a= ");
    gets(a);
    printf("b= ");
    gets(b);
    if(GreatEq(a, b)) puts("a>=b");
    else puts("a<b");
    return 0;
}
2
forte
2 / 2 / 0
Регистрация: 22.06.2010
Сообщений: 6
27.02.2011, 12:21 #4
Pascal
1
2
3
4
5
6
7
8
9
10
11
Function Eq(A, B : TLong) : Boolean;
    Var i : Integer;
    Begin
        Eq := False;
        If A[0] <> B[0] Then Exit 
        Else Begin
            i := l;
            While (i <= A[0]) And (A[i] = B[i]) Do Inc(i);
            Eq := i = A[0] + l
              End
    End;
1
FroL
61 / 49 / 6
Регистрация: 07.01.2010
Сообщений: 307
27.02.2011, 12:26 #5
Если число лежит в диапазоне от 0 до 4 294 672 295 то
Я немного не точно написал - число может быть от -2 147 336 145 до + -2 147 336 145)))
Цитата Сообщение от forte Посмотреть сообщение
число может быть отрицательным
Если:
C++
1
2
a = -2;
b = -5;
То выводит сообщени: "а больше b".
1
Marina91
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 13
28.02.2011, 13:37  [ТС] #6
Цитата Сообщение от FroL Посмотреть сообщение
Если число лежит в диапазоне от 0 до 4 294 672 295 то
Я немного не точно написал - число может быть от -2 147 336 145 до + -2 147 336 145)))

Если:
C++
1
2
a = -2;
b = -5;
То выводит сообщени: "а больше b".
имеются в виду числа со 100+ знаками,
0
FroL
61 / 49 / 6
Регистрация: 07.01.2010
Сообщений: 307
28.02.2011, 13:48 #7
Тогда можно реализовать так: это число содержится как строка. Потом вы запускаете цикл и начинаете посимвольно сравнивать, с начала.Допустим: a = "581921", b = "582145". Первый шаг - 5 == 5, второй - 8 ==8, третий 1 < 2. Значит второе число больше. Только не забывайте приводить каждое число к типу int.
1
Marina91
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 13
28.02.2011, 14:07  [ТС] #8
Цитата Сообщение от igorrr37 Посмотреть сообщение
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
#include<stdio.h>
#include<string.h>
 
int GreatEq(const char *a, const char* b){
    if(strlen(a)<strlen(b)) return 0;
    else if(strlen(a)>strlen(b)) return 1;
    else {
        do{
            if(*a<*b) return 0;
        }while(a++, *b++);
        return 1;
    }
}
 
int main (void){
    char a[100], b[100];
    printf("a= ");
    gets(a);
    printf("b= ");
    gets(b);
    if(GreatEq(a, b)) puts("a>=b");
    else puts("a<b");
    return 0;
}
не работает для отрицательных чисел.
ап народ спасайте
0
FroL
61 / 49 / 6
Регистрация: 07.01.2010
Сообщений: 307
28.02.2011, 14:11 #9
Цитата Сообщение от Marina91 Посмотреть сообщение
не работает для отрицательных чисел.
ап народ спасайте
Надо добавить проверку на наличие знака "-" в строках. Если первое число минус, то второе больше. Если оба числа одинаковые то надо искать наименьшее:
C++
1
2
3
4
5
  do
    {
      if(*a > *b) return 0;
    } 
  while(a++, *b++);
1
Marina91
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 13
28.02.2011, 14:33  [ТС] #10
Цитата Сообщение от FroL Посмотреть сообщение
Надо добавить проверку на наличие знака "-" в строках. Если первое число минус, то второе больше. Если оба числа одинаковые то надо искать наименьшее:
C++
1
2
3
4
5
  do
    {
      if(*a > *b) return 0;
    } 
  while(a++, *b++);
C++
1
2
3
4
5
6
7
8
9
int GreatEq(const char *a, const char* b){
    if(strlen(a)<strlen(b)) return 0;
    else if(strlen(a)>strlen(b)) return 1;
    else {
        do{
            if(*a<*b) return 0;
        }while(a++, *b++);
        return 1;
    }
что тут надо добавить на проверку "-", напиши пожалуйста
0
FroL
61 / 49 / 6
Регистрация: 07.01.2010
Сообщений: 307
28.02.2011, 14:44 #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
int GreatEq(const char *a, const char* b)
  {
    if(a[0] == 45 && b[0] == 45)
      {
        if(strlen(a)<strlen(b)) return 1;
        else if(strlen(a)>strlen(b)) return 0;
        else 
          {
            do
              {
                if(*a < *b) return 1;
              }while(a++, *b++);
            return 0;     
      }
    else if(a[0] == 45)  return 0;
    else if(b[0] == 45)  return 1;
    else
      {
        if(strlen(a)<strlen(b)) return 0;
        else if(strlen(a)>strlen(b)) return 1;
        else 
          {
            do
              {
                if(*a > *b) return 1;
              }
            while(a++, *b++);
            return 0;
          }
      }
  }
1
Marina91
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 13
28.02.2011, 14:58  [ТС] #12
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
#include<stdio.h>
#include<string.h>
#include<iostream>
 
int GreatEq(const char *a, const char* b)
  {
    if(a[0] == 45 && b[0] == 45)
      {
        if(strlen(a)<strlen(b)) return 1;
        else if(strlen(a)>strlen(b)) return 0;
        else 
          {
            do
              {
                if(*a < *b) return 1;
              }while(a++, *b++);
            return 0;     
      }
    else if(a[0] == 45)  return 0;
    else if(b[0] == 45)  return 1;
    else
      {
        if(strlen(a)<strlen(b)) return 0;
        else if(strlen(a)>strlen(b)) return 1;
        else 
          {
            do
              {
                if(*a > *b) return 1;
              }
            while(a++, *b++);
            return 0;
          }
      }
  }
 
int main (void){
    char a[100], b[100];
    printf("a= ");
    gets(a);
    printf("b= ");
    gets(b);
    if(GreatEq(a, b)) puts("a>=b");
    else puts("a<b");
system("pause");
}
не работает, что не так?
0
FroL
61 / 49 / 6
Регистрация: 07.01.2010
Сообщений: 307
28.02.2011, 18:29 #13
А не получается, когда оба числа отрицательные???
0
igorrr37
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
28.02.2011, 18:40 #14
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
#include<stdio.h>
#include<string.h>
 
int GreatEq(const char *a, const char* b){
    while(!isdigit(*a)&&*a!='-')++a;
    while(!isdigit(*b)&&*b!='-')++b;
    char *pa=a, *pb=b;
    if(isdigit(*a)&&*b=='-')return 1;
    else if(isdigit(*b)&&*a=='-')return 0;
    else{
        if(strlen(a)<strlen(b)) return *pa=='-'?1:0;
        else if(strlen(a)>strlen(b)) return *pa=='-'?0:1;
        else {
            do{
                if(*a<*b) return *pa=='-'?1:0;
            }while(a++, *b++);
            return 1;
        }
    }
}
 
int main (void){
    char a[100], b[100];
    printf("a= ");
    gets(a);
    printf("b= ");
    gets(b);
    if(GreatEq(a, b)) puts("a>=b");
    else puts("a<b");
    return 0;
}
1
Marina91
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 13
28.02.2011, 19:24  [ТС] #15
igorrr37
спасибо, работает
C++
1
2
while(!isdigit(*a)&&*a!='-')++a;
while(!isdigit(*b)&&*b!='-')++b;
объясните, что делает ф-ия isdigit
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
28.02.2011, 19:25 #16
Цитата Сообщение от Marina91 Посмотреть сообщение
объясните, что делает ф-ия isdigit
Дает истину, если символ цыфра.
1
28.02.2011, 19:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2011, 19:25
Привет! Вот еще темы с решениями:

Длинная арифметика. Перемножение двух больших чисел. Пропуск итераций
Программа работает корректно с числами, оканчивающимися не на нуль. Пробовал...

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

Длинная арифметика: сумма двух строк
int One = strlen(BufOne); int Two = strlen(BufTwo); int MaxL = max(One,...

Длинная арифметика, деление чисел
http://www.cyberforum.ru/attachment.php?attachmentid=393890&amp;stc=1&amp;d=1398936287...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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