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

Длинная арифметика - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Marina91
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 13
27.02.2011, 08:28     Длинная арифметика #1
Привет всем! помогите пожалуйста кодом.
Необходимо реализовать операцию сравнения двух длинных чисел A>=B
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 08:28     Длинная арифметика
Посмотрите здесь:

Длинная арифметика C++
C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FroL
61 / 49 / 2
Регистрация: 07.01.2010
Сообщений: 301
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;
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
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;
}
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;
FroL
61 / 49 / 2
Регистрация: 07.01.2010
Сообщений: 301
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".
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+ знаками,
FroL
61 / 49 / 2
Регистрация: 07.01.2010
Сообщений: 301
28.02.2011, 13:48     Длинная арифметика #7
Тогда можно реализовать так: это число содержится как строка. Потом вы запускаете цикл и начинаете посимвольно сравнивать, с начала.Допустим: a = "581921", b = "582145". Первый шаг - 5 == 5, второй - 8 ==8, третий 1 < 2. Значит второе число больше. Только не забывайте приводить каждое число к типу int.
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;
}
не работает для отрицательных чисел.
ап народ спасайте
FroL
61 / 49 / 2
Регистрация: 07.01.2010
Сообщений: 301
28.02.2011, 14:11     Длинная арифметика #9
Цитата Сообщение от Marina91 Посмотреть сообщение
не работает для отрицательных чисел.
ап народ спасайте
Надо добавить проверку на наличие знака "-" в строках. Если первое число минус, то второе больше. Если оба числа одинаковые то надо искать наименьшее:
C++
1
2
3
4
5
  do
    {
      if(*a > *b) return 0;
    } 
  while(a++, *b++);
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;
    }
что тут надо добавить на проверку "-", напиши пожалуйста
FroL
61 / 49 / 2
Регистрация: 07.01.2010
Сообщений: 301
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;
          }
      }
  }
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");
}
не работает, что не так?
FroL
61 / 49 / 2
Регистрация: 07.01.2010
Сообщений: 301
28.02.2011, 18:29     Длинная арифметика #13
А не получается, когда оба числа отрицательные???
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
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;
}
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2011, 19:25     Длинная арифметика
Еще ссылки по теме:

C++ Длинная арифметика
Длинная арифметика C++

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

Или воспользуйтесь поиском по форуму:
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
28.02.2011, 19:25     Длинная арифметика #16
Цитата Сообщение от Marina91 Посмотреть сообщение
объясните, что делает ф-ия isdigit
Дает истину, если символ цыфра.
Yandex
Объявления
28.02.2011, 19:25     Длинная арифметика
Ответ Создать тему
Опции темы

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