1

假设我有一个简单的 for 循环,其索引i0to n。我希望能够循环i,每个循环按以下顺序生成两个数字:

i | a | b
=========
0 | 2 | 1
1 | 2 | 3
2 | 2 | 5
3 | 5 | 1
4 | 5 | 3
5 | 5 | 5
6 | 9 | 1
7 | 9 | 3
8 | 9 | 5
9 | 12| 1
10| 12| 3
11| 12| 5
12| 16| 1
   ...

基本上,该算法是,因为a它从开始并依次2递增,而因为它总是经过,然后重新开始。34b135

我一直在尝试制作一些没有太多结果的东西。我更喜欢的答案,但伪代码或任何非深奥的语言都可以。

4

6 回答 6

3
class Main
{
    public static void main (String[] args)
    {
        for(int i = 0 ; i < 20 ; i++)
        {
            int a = (i / 6) * 7 + 2 + ((i / 3) & 1) * 3;
            int b = (i % 3) * 2 + 1;
            System.out.println(i + " | " + a + " | " + b);
        }
    }
}
于 2013-01-14T13:04:40.097 回答
1

只是为了好玩,这就是在中的做法:

(for [a (reductions + 2 (apply concat (repeat [3 4])))
      b [1 3 5]] 
   [a b])
于 2013-01-14T13:11:20.640 回答
0

假设 n=20,我有以下解决方案:

public static void main(String[] args) {
    int i = 0;
    int n = 20;
    for (int a = 2; a <= n; a += 3) {
        for (int b = 1; b <= 5; b += 2) {
            System.out.println(i++ + " | " + a + " | " + b);
        }
    }
}
于 2013-01-14T13:00:12.040 回答
0

在 C 中,可以如下这样更容易阅读和理解;

#include <stdio.h>

int main(void)
{
   int i = 0;
   int N = 10;
   int a = 2;
   int b = 1;
   int odd = 1;

   printf("i |a | b\n"); 
   for(;i<N;i++) {
    if(b == 5) {
       if(odd) {
        a += 3;
        odd = 0;
       }else{
         a+=4;
         odd = 1;
       }
      }
      b +=2;
     if(b >5) b = 1;
    printf("%d |%d | %d \n", i, a, b);

   }
   return 0;
}
于 2013-01-14T13:01:55.230 回答
0
for(int i = 0; i < n; i++){
    int a = ((i + 3) / 6) * 3 + ((i + 0) / 6) * 4 + 2;
    int b = i % 3 * 2 + 1;
    System.out.println(i++ + " | " + a + " | " + b);
}
于 2013-01-14T13:10:06.637 回答
0

尝试(C 中的答案)

int increments[3] = {2, 3, 4};
for(i = 0; i < limit; i++){
    if((i/3) % 3 == 0) a += increments[(i/3) % 3];
    b = 2 * (i % 3) + 1;
}
于 2013-01-14T13:11:55.013 回答