2013-01-14 29 views
1

假设我有一个简单的for循环,其索引为i,从0n。我想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 
    ... 

基本上,该算法是,对于a2开始并递增3和轮流4,而对于它总是经过1,35然后重新开始。

我一直在努力生产没有太多结果的东西。我宁愿在的答案,但伪代码或任何非深奥的语言将会很好。

回答

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); 
     } 
    } 
} 
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); 
     } 
    } 
} 
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; 
} 
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); 
} 
1

突出部分为它的乐趣,这是一个如何做它

(for [a (reductions + 2 (apply concat (repeat [3 4]))) 
     b [1 3 5]] 
    [a b]) 
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; 
}