Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 反映循环迭代器关于迭代次数中点的数学运算_Algorithm_Loops_Sorting_Fortran_Countdown - Fatal编程技术网

Algorithm 反映循环迭代器关于迭代次数中点的数学运算

Algorithm 反映循环迭代器关于迭代次数中点的数学运算,algorithm,loops,sorting,fortran,countdown,Algorithm,Loops,Sorting,Fortran,Countdown,假设我们有一个循环,索引变量n从1计数到6。当我通过这个循环时,我想打印这些值 1 2 3 3 2 1 是否有一个优雅的数学运算,即避免可以实现这一点的if语句?例如,如果我打印 1 + modulo(n-1,3) 它会打印出来 1 2 3 1 2 3 但我想让下半场逆转。如果有帮助的话,循环的迭代次数总是偶数。我正在用Fortran 90编写 n = 6 for i in range(1,n+1): print(min(i, n + 1 - i)) or (// i

假设我们有一个循环,索引变量n从1计数到6。当我通过这个循环时,我想打印这些值

1
2
3
3
2
1
是否有一个优雅的数学运算,即避免可以实现这一点的if语句?例如,如果我打印

1 + modulo(n-1,3) 
它会打印出来

1
2
3
1
2
3
但我想让下半场逆转。如果有帮助的话,循环的迭代次数总是偶数。我正在用Fortran 90编写

n = 6 
for i in range(1,n+1):
   print(min(i, n + 1 - i))
      or (// is integer division equivalent to bitshift right) 
   print(n//2 - abs(n + 1 - 2 * i)//2)

>> 1 2 3 3 2 1
对于奇数长度-第一种方法按原样工作,第二种方法需要更改为n+1//2,对于偶数长度,它不会中断工作

查找两个32位整数最小值的位技巧:

min = b+((a-b)&((a-b)>>31))
对于奇数长度-第一种方法按原样工作,第二种方法需要更改为n+1//2,对于偶数长度,它不会中断工作

查找两个32位整数最小值的位技巧:

min = b+((a-b)&((a-b)>>31))

那么以下内容如何:

do i=1,n
   print *, int(abs(i-n/2.0-0.5)+0.5)
end do

这将打印偶数n的预期结果,并为奇数n引入零。

以下内容如何:

do i=1,n
   print *, int(abs(i-n/2.0-0.5)+0.5)
end do

这将打印偶数n的预期结果,并为奇数n引入零。

以下内容足够优雅吗?我认为这比模糊的数学要清楚得多

ian-admin@agon ~/work/stack $ cat merge.f90
Program test
  Implicit None
  Integer :: n
  Integer :: i
  Write( *, * ) 'n?'
  Read ( *, * ) n
  Do i = 1, n
     Write( *, * ) Merge( i, n - ( i - 1 ), i <= n / 2 )
  End Do
End Program test
ian-admin@agon ~/work/stack $ gfortran -std=f2003 -Wall -Wextra merge.f90 
ian-admin@agon ~/work/stack $ ./a.out
 n?
6
           1
           2
           3
           3
           2
           1
ian-admin@agon ~/work/stack $ ./a.out
 n?
7
           1
           2
           3
           4
           3
           2
           1
ian-admin@agon ~/work/stack $ 

以下这些足够优雅吗?我认为这比模糊的数学要清楚得多

ian-admin@agon ~/work/stack $ cat merge.f90
Program test
  Implicit None
  Integer :: n
  Integer :: i
  Write( *, * ) 'n?'
  Read ( *, * ) n
  Do i = 1, n
     Write( *, * ) Merge( i, n - ( i - 1 ), i <= n / 2 )
  End Do
End Program test
ian-admin@agon ~/work/stack $ gfortran -std=f2003 -Wall -Wextra merge.f90 
ian-admin@agon ~/work/stack $ ./a.out
 n?
6
           1
           2
           3
           3
           2
           1
ian-admin@agon ~/work/stack $ ./a.out
 n?
7
           1
           2
           3
           4
           3
           2
           1
ian-admin@agon ~/work/stack $ 
考虑

min(n, 7-n)
当n从1变为6时,该表达式生成1,2,3,3,2,1。更一般地说,如果N是变量N的偶数上界,则公式为:

min(n, N+1-n)
产生

1, 2, ..., N/2, N/2, N/2 - 1, ..., 2, 1
因为n在1和n之间运行

在N为奇数的情况下,相同的公式生成序列

1, 2, ..., (N+1)/2, (N-1)/2, ..., 2, 1.
例如:

1, 2, 3, 4, 3, 2, 1
对于N=7.

考虑

min(n, 7-n)
当n从1变为6时,该表达式生成1,2,3,3,2,1。更一般地说,如果N是变量N的偶数上界,则公式为:

min(n, N+1-n)
产生

1, 2, ..., N/2, N/2, N/2 - 1, ..., 2, 1
因为n在1和n之间运行

在N为奇数的情况下,相同的公式生成序列

1, 2, ..., (N+1)/2, (N-1)/2, ..., 2, 1.
例如:

1, 2, 3, 4, 3, 2, 1

对于N=7。

您能否概述一下哪些函数和运算符是可以接受的,哪些过于昂贵?绝对值、符号、平方根、平方、除法、整数除法、模、乘法、下限/舍入/上限、按位和/或/异或、位移位、使用浮点数……minn、7-n是否可以接受?当n从1变为6时,它将产生1,2,3,3,2,1。@m69我对费用没有任何特别的想法。@LeandroCaniglia效果很好,谢谢你,如果你想写下来作为答案,我会接受的。哦,我认为这是一个速度的微观优化。你能概述一下哪些函数和运算符是可以接受的,哪些太贵了吗?绝对值、符号、平方根、平方、除法、整数除法、模、乘法、下限/舍入/上限、按位和/或/异或、位移位、使用浮点数……minn、7-n是否可以接受?当n从1变为6时,它将产生1,2,3,3,2,1。@m69我对费用没有任何特别的想法。@LeandroCaniglia工作得很好,谢谢,如果你想把它写下来作为一个答案,我会接受的。哦,我认为这是一个速度的微型优化。谢谢,这很好,很容易理解,我不知道merge如何根据逻辑掩码指定的条件在两个值之间或两个数组中的对应元素之间进行选择。有关更多信息和示例,请参阅。谢谢,这很好而且易于理解,我不知道根据逻辑掩码指定的条件在两个值之间或两个数组中的对应元素之间进行合并选择。有关更多信息和示例,请参阅。