Си, деление больших чисел.

geh
Сообщений: 224
Зарегистрирован: 09 дек 2013, 21:00

Си, деление больших чисел.

Сообщение geh » 19 янв 2014, 13:37

Я уже как 2 дня Си-программист.
И предлагаю вашему вниманию программу,
которую я переделал с QBasic, но на форуме
она не привлекла внимания.
Эта программа делит два 100-значных числа и получает такой же длины третье.
Числа представлены в виде массивов. В нулевом месте массивов стоит порядок чисел
(все остальное - мантисса). Алгоритм программы - это поразрядное вычитание.
Очередная цифра определяется так: Если нельзя вычесть ни разу - цифра 0,
если можно N раз - цифра N (N<10). Программа проверена под Windows XP.

Код: Выбрать все

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <stdio.h>

#pragma argsused
int main(int args, char* argv[])
{
   int a[101];
   int b[101];
   int c[101];
   int e,i,j,k;
   for(i=0;i<101;i++)      a[i]=b[i]=c[i]=0;   c[0]=a[0]-b[0];   for(i=1;i<101;i++)   {      if (a[i]==b[i]) goto o11;      if (a[i]>b[i]) goto o22;
      c[0]-=1;
      a[1]=10*a[1]+a[2];
      for(j=2;j<100;j++)         a[j]=a[j+1];      a[100]=0;      goto o22;o11:   };o22:   for(k=1;k<101;k++)   {      for(e=0;e<10;e++)      {         for(i=1;i<101;i++)         {            if(a[i]==b[i]) goto o33;            if(a[i]>b[i] goto o44;
            a[1]=10*a[1]+a[2];
            for(j=2;j<100;j++)               a[j]=a[j+1];            a[100]=0;            c[k]=e;            goto o77;o33:     }o44:     for(i=1;i<101;i++)               a[i]-=b[i];            for(i=100;i>1;i--)
            {
               if(a[i]<0)               {                  a[i]+=10;                  a[i-1]-=1;               }            }         }o77:      };   return 0;}

конечно у меня куча вопросов
1) что из себя представляет эта программа? (это моя первая на Си программа)
2) как ее улучшить?
3) как обнулить массив не используя цикл?
4) как остановить программу для просмотра?
я использовал cin, я еще не знаю какой h-файл подключить.
Особая благодарность folk !!!!! Он нашел нужные слова. СПАСИБО!!
Последний раз редактировалось geh 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Си, деление больших чисел.

Сообщение NT » 19 янв 2014, 14:29

geh писал(а):Source of the post Программа проверена под Windows XP.
...
1) что из себя представляет эта программа? ...

Интересный вопрос.
А что тогда проверяли под XP?

PS. У меня эта программа не скомпилировалась под Dev-C++
Последний раз редактировалось NT 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

SUILVA
Сообщений: 151
Зарегистрирован: 26 мар 2009, 21:00

Си, деление больших чисел.

Сообщение SUILVA » 19 янв 2014, 14:33

Что из себя представляет эта программа? Это Вы сами должны знать, а я физический не могу ( … ).
Там есть хорошая идея, но с попаданием на отрицательные числа.
На место int надо бы взять другой тип, чтобы лишние нули не таскать.
Есть разные подходы (для быстрого вычисления):
Сначала создают базу в виде таблицы: 0, в, 2в, … 9в. Методом деления пополам, проверяют какое число из базы можно взять для вычитания;
Если взяли int то возьмите уж int64. И длинные числа a и b разделите по n цифр;
Переходят двоичную систему, там же производят деление.
Последний раз редактировалось SUILVA 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

geh
Сообщений: 224
Зарегистрирован: 09 дек 2013, 21:00

Си, деление больших чисел.

Сообщение geh » 19 янв 2014, 14:50

У меня программа Borland C++ Builder 6.0.
Честно говоря, я не знаю почему она у вас не работает
может быть h-файлы другие надо подключать или еще что
(я в этом не специалист, я всего два дня как установил программу)
Может кто другой лучше знает.
Я еще учусь и ничего не могу сказать.
Поэтому мне и хочется услышать мнение других.
Последний раз редактировалось geh 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

SUILVA
Сообщений: 151
Зарегистрирован: 26 мар 2009, 21:00

Си, деление больших чисел.

Сообщение SUILVA » 19 янв 2014, 14:57

Свое время я тоже занимался делением больших чисел.
Последний раз редактировалось SUILVA 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

geh
Сообщений: 224
Зарегистрирован: 09 дек 2013, 21:00

Си, деление больших чисел.

Сообщение geh » 19 янв 2014, 15:06

Мне подарили диск. Там куча разных языков программирования.
Несколько Бейсиков, Паскалей (Дельфи), Си, Ассемблер, разные компиляторы и другие программы
- все не изучить и за 200 лет.
Последний раз редактировалось geh 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Си, деление больших чисел.

Сообщение folk » 19 янв 2014, 18:24

В среде борланд должен быть отладчик - вы запускаете программу установив точку отладки там она и встанет при запуске - и вы сможете выполнять ее пошагово смотреть переменные

По программе - постарайтесь использовать
#define INT_SIZE 100
и далее писать не 101 а (INT_SIZE+1)

if () { }
else { }
позволит вам обойтись без goto, есть операторы break и continue

по сути программы в логику не врубился (пардон - поздновато думать сегодня) запустить не могу из за экзотических инклюдов типа vcl.h, посему
посмотрите насколько корректно тупо преобразовал ваш код (вполне мог ошибиться - но тем не менее)

Код: Выбрать все

 for(i=1;i<101;i++)
{
if (a[i]==b[i]) goto o11;
if (a[i]>b[i]) goto o22;
c[0]-=1;
a[1]=10*a[1]+a[2];
for(j=2;j<100;j++)
a[j]=a[j+1];
a[100]=0;
goto o22;
o11:
};
o22:


Код: Выбрать все

 for(i=1;i<101;i++)
 {
 if (a[i] == b[i]) continue;
 if (a[i]>b[i]) break;
 c[0]--;
 a[1]=10*a[1]+a[2];
 for(j=2;j<100;j++) a[j]=a[j+1];
 a[100]=0;
 break;
 };


Код: Выбрать все

 for(i=1; (a[i]==b[i]) && (i < INT_SIZE); i++); // пока одинаковые пропускаем
 if ( i < INT_SIZE ) {
 if ( a[i] < b[i] ) { // если остались байты
 c[0]--;
 a[1] = 10*a[1]+a[2];
 for(j=2;j<INT_SIZE;j++) a[j]=a[j+1];
 a[INT_SIZE]=0;
 }
 }

борьба за читаемость (понимаемость) кода важна ибо в легко читаемом коде ошибки видны быстрее)
Последний раз редактировалось folk 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Си, деление больших чисел.

Сообщение kiv » 19 янв 2014, 20:33

Меня сегодня на серьезное не хватает, но пару слов скажу.

1а. В C/C++ первый элемент массива - нулевой.
1б. Если это C++, то лучше переменные объявлять поближе к месту их использования.

2. С моей точки зрения, Borland - не лучший вариант: они вносят в язык слишком много собственных расширений, так что потом оказывается достаточно сложно обеспечить переносимость.

Рекомендовать что-то не стану, дело вкуса Сам часто пользуюсь по историческим причинам Open Watcom (нравится больше всего, поддержка операционок у него вообще уникальная :), но 1. все никак не выйдет новая версия, в которой был бы более широко реализован стандарт (не хватает некоторых фишек из шаблонов и STL, про поддержку C++11 вообще молчу), 2. его многие разработчики библиотек не признают, и приходится или "напильником доточивать" сторонние продукты, или искать/писать другие... ну, и кодогенератор все же несколько хуже, чем у Visual C++) и Visual C++ 2100.

Иногда - в основном для простеньких вещей на заказ - GCC.

Когда надо что-то особо оконное - библиотека wxWidgets.
Последний раз редактировалось kiv 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

geh
Сообщений: 224
Зарегистрирован: 09 дек 2013, 21:00

Си, деление больших чисел.

Сообщение geh » 20 янв 2014, 06:07

folk, большое СПАСИБО!! Ваш код читается лучше моего.
Вот я и перешел на Си. Такое впечатление будто это старый знакомый.

Kiv, я хочу вам пояснить, почему я выбрал именно этот язык.
На нем можно писать не только консольные программы, но и приложения
для Windows XP. В этом языке реализован RAD-стиль разработки.
Он полностью совместим с Visual C++.
Kiv, большое спасибо за советы.
Последний раз редактировалось geh 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Си, деление больших чисел.

Сообщение kiv » 20 янв 2014, 08:37

geh писал(а):Source of the post
На нем можно писать не только консольные программы, но и приложения
для Windows XP.


Это можно на любом языке при наличии возможности выполнять системные вызовы

Но - из педагогических целей - я бы рекомендовал сначала хорошо разобраться в языке, не отвлекаясь на проблемы вывода. Попытаюсь пояснить свою мысль - да, можно просто использовать какие-то функции, классы etc, но без глубокого понимания, КАК это реализовано - эффективно их использовать будет сложно.

Ну и о совместимости Borland и Visual - вообще-то говоря, совместимость в общем случае есть только одна: стандарт языка. Как только начинается использование каких-то библиотек и т.п., как правило, вся совместимость оказывается несколько преувеличенной. А Борланд - правда, сразу оговорюсь - после 4.5-го я к нему не прикасался - всегда отличался тем, что добавлял свои расширения языка. Не думаю, что он очень изменился Кстати, насколько я знаю, GCC этим тоже страдает
Последний раз редактировалось kiv 27 ноя 2019, 21:48, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 6 гостей