假设我有一个简单的for循环,索引i
从0
到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
开头,并依次递增3
和4
,而对于b
,它始终是通过1
,3
和5
,然后重新开始。
我一直在尝试制作没有太多结果的东西。我更喜欢java中的答案,但伪代码或任何非深奥的语言都可以。
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:1)
只是为了它的乐趣,这就是clojure:
中的一个人(for [a (reductions + 2 (apply concat (repeat [3 4])))
b [1 3 5]]
[a b])
答案 2 :(得分: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);
}
}
}
答案 3 :(得分: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;
}
答案 4 :(得分: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);
}
答案 5 :(得分: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;
}