Помогите перевести на Basic

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Помогите перевести на Basic

Сообщение alibek » 01.08.2003 (Пт) 11:40

Привет, форумцы :)
Есть функция на C, и хотелось бы ее получить на бейсике. Сам я пробовал, что-то не очень выходит.
Код вот:
Код: Выделить всё
BOOL pi(LPTSTR szPi, const int digits)
{
  LPTSTR szCurDigit = szPi;

  if (digits > 54900)
  {
    ::MessageBox(::GetActiveWindow(),
                  _T("n must be <= 54900"),
                  _T("Error in pi()"), 0);
    return FALSE;
  }
 
  int d = 0, e, b, g, r;
  int c = (digits / 4 + 1) * 14;
  int * a = (int*)alloca(c * sizeof(int));
  int f = 10000;
 
  for(int i = 0; i < c; i++)
    a[i] = 20000000;
 
  while((b = c -= 14) > 0)
  {
    d = e = d % f;
   
    While (--b > 0)
    {
      d = d * b + a[b];
      g = (b << 1) - 1;
      a[b] = (d % g) * f;
      d /= g;
    }
   
    r = e + d / f;
   
    if (r < 1000)
    {
      if(r > 99)
      {
        *szCurDigit = '0';
        szCurDigit++;
      }
      else if(r > 9)
      {
        *szCurDigit = '0';
        szCurDigit++;
        *szCurDigit = '0';
        szCurDigit++;
      }
      Else
      {
        *szCurDigit = '0';
        szCurDigit++;
        *szCurDigit = '0';
        szCurDigit++;
        *szCurDigit = '0';
        szCurDigit++;
      }
      //pi.Append(zero[r > 99 ? 0 : r > 9 ? 1 : 2]);
    }

    itoa(r, szCurDigit, 10);
    szCurDigit = szCurDigit + lstrlen(szCurDigit);
    //pi.Append(r);
  }

  *szCurDigit = 0;
  return TRUE;
}
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.08.2003 (Сб) 4:41

Имхо, ...

Код: Выделить всё
Function Pi(ByVal Digits As Long) As String
  Dim d As Long, e As Long, b As Long, g As Long, r As Long
  Dim c As Long, f As Long, a() As Long
  Dim i As Long
 
  If Digits > 54900 Then MsgBox "Количество цифр должно не больше 54900", vbCritical, "Ошибка в Pi()": Exit Function
 
  d = 0
  c = (Digits / 4 + 1) * 14
  ReDim a(0 To c - 1)
  f = 10000
 
  For i = 0 To c - 1
    a(i) = 20000000
  Next
 
  c = c - 14
  b = c
  Do While b > 0
    e = d Mod f
    d = e
    b = b - 1
    Do While b > 0
      d = d * b + a(b)
      g = b * 2 - 1
      a(b) = (d Mod g) * f
      d = d / g
      b = b - 1
    Loop
   
    r = e + d / f
   
    If r < 1000 Then
      If r > 99 Then
        Pi = Pi + "0"
      ElseIf r > 9 Then
        Pi = Pi + "00"
      Else
        Pi = Pi + "000"
      End If
    End If
    Pi = Pi & r
   
    c = c - 14
    b = c
  Loop
End Function

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.08.2003 (Сб) 11:38

Спасибо :)
Видимо алгоритм кривой. По идее функция должна вычислять число ПИ, а тут уже на четвертом знаке ошибка. Но все равно сенкс.
Lasciate ogni speranza, voi ch'entrate.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 02.08.2003 (Сб) 12:11

А чего за алгоритм?
Если Digits = 4 то 4-ый знак правилно, а если больше, то - нет
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 4

    TopList