Страница 1 из 2

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

Добавлено: 19 янв 2014, 13:37
geh
Я уже как 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 !!!!! Он нашел нужные слова. СПАСИБО!!

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

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

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

PS. У меня эта программа не скомпилировалась под Dev-C++

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

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

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

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

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

Добавлено: 19 янв 2014, 14:57
SUILVA
Свое время я тоже занимался делением больших чисел.

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

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

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

Добавлено: 19 янв 2014, 18:24
folk
В среде борланд должен быть отладчик - вы запускаете программу установив точку отладки там она и встанет при запуске - и вы сможете выполнять ее пошагово смотреть переменные

По программе - постарайтесь использовать
#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;
 }
 }

борьба за читаемость (понимаемость) кода важна ибо в легко читаемом коде ошибки видны быстрее)

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

Добавлено: 19 янв 2014, 20:33
kiv
Меня сегодня на серьезное не хватает, но пару слов скажу.

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

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

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

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

Когда надо что-то особо оконное - библиотека wxWidgets.

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

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

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

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

Добавлено: 20 янв 2014, 08:37
kiv
geh писал(а):Source of the post
На нем можно писать не только консольные программы, но и приложения
для Windows XP.


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

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

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