fortran77 продолжаю перепутанные петли

Я пытаюсь перевести программу на Фортране в версию C ++, а затем я нашел такой код:

100 DO 120 I=2,7
DO 110 J=1,3
IF(IU(J)/I*I-IU(J))120,110,120
110 CONTINUE
GO TO 130
120 CONTINUE
GO TO 150
130 DO 140 J=1,3
140 IU(J)=IU(J)/I
GO TO 100
150 CONTINUE
END

А также END это конец.

Моя версия C ++:

bool flag=true;

while(flag){
flag=false;
for (int i = 2; i <= 7; i++) {
for (int j = 0; j < 3; j++) {
if ((IU[j]/i*i==IU[j])) {
flag=true; break;
}
else {
continue;
}
}
if (!flag) {
break;
}
else {
for (int j = 0; j < 3; j++) {
IU[j]=IU[j]/i;
}
}
}
}

Я уверен, что это неправильно, но не смог разобраться в правильности. Так как же перевести код на фортране на с ++?

-1

Решение

Самое главное, чтобы понять, что делает код.

Это похоже на неприятный фрагмент кода, но при более тщательном анализе становится ясно, что он делает — он делит значения iu на i, i в диапазоне от 2 до 7, до тех пор, пока все значения делятся на i.

Некоторая работа тратится впустую делением на не простые числа.

Вы должны спросить себя, почему он останавливается на 7. Это может быть жестко ограниченное ограничение из-за небольших объемов памяти несколько десятилетий назад.

Вот версия на C (не проверенная, и отступы испорчены).

#define NIU 3
#define NDIVISORS 4

void foo(int *iu)
{
int i,j;

static int divisors[NDIVISORS] = {2, 3, 5, 7};

for (i=0; i<NDIVISORS;i++)
{
int has_divisor = 1;
while (has_divisor)
{
for (j=0; j<NIU; j++)
{
if (iu[j] % divisors[i] != 0)
{
has_divisor = 0;
break;
}
}
if (has_divisor)
{
for (j=0; j<NIU; j++)
iu[j] = iu[j] / i;
}
}
}
}

А вот версия на современном Фортране (чтобы сделать алгоритм более понятным):

subroutine foo(iu)
implicit none
integer, dimension(3), intent(inout) :: iu
integer, dimension(4), parameter :: divisors =  [2, 3, 5, 7]
integer :: i

do i=1, size(divisors)
do while (all(mod(iu, divisors(i)) == 0))
iu = iu / divisors(i)
end do
end do
end subroutine foo
1

Другие решения


По вопросам рекламы [email protected]