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

-
-
- Сообщения: 14205
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
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-ый знак правилно, а если больше, то - нет
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot] и гости: 4