我正在努力取得以下结果:
120
200 202
280 284 288
360 366 372 378
440 448 456 464 472
520 530 540 550 560 570
600 612 624 636 648 660 672
680 694 708 722 736 750 764 778
760 776 792 808 824 840 856 872 888 如您所见,每一行增加80,每行中的连续数字之间的差异是i*2 (其中,我的行号从0开始)。
我已经写下了这段代码,它实际上产生了这样的结果:
public class Triangle
{
public static void main(String [] args)
{
System.out.println(120);
System.out.print(i + " ");
}
System.out.println();
for (int i = 280 ; i <= 288; i = i + 4 ) {
System.out.print(i + " ");
}
System.out.println();
System.out.print(i + " ");
}
System.out.println();
for (int i = 440 ; i <= 472; i = i + 8 ) {
System.out.print(i + " ");
}
System.out.println();
for (int i = 520 ; i <= 570; i = i + 10 ) {
System.out.print(i + " ");
}
System.out.println();
for (int i = 600 ; i <= 672; i = i + 12 ) {
System.out.print(i + " ");
}
System.out.println();
for (int i = 680 ; i <= 778; i = i + 14 ) {
System.out.print(i + " ");
}
System.out.println();
for (int i = 760 ; i <= 888; i = i + 16 ) {
System.out.print(i + " ");
}
System.out.println();
}
}但是,这段代码真的很长。你可以看到,我每次自己加80个。有什么方法可以让我添加另一个永久循环来代替它吗?安也增加了2s?
谢谢
发布于 2015-07-06 21:28:44
尝试将您的问题分成不同的部分,如
print N lines
in each line print M values 这样的循环看起来有点像
for (int line = 1 ; line <= N; line++){
for (int position = 1; position <= M; position++){
print(calculateFor(line, position));
}
printLineSeparator;
}(我从1开始索引,但您应该习惯于使用0索引,因此考虑将这些循环重写为表单for (int x = 0; ...)作为作业)
现在,我们的问题是基于line数及其position in line来计算合适的值。
让我们从计算每一行第一个值的公式开始。
我们可以很容易地计算它,因为它是线性函数f(line)=...,我们知道
x | 1 | 2 | 3 |
----+-----+-----+-----+ .....
f(x)| 120 | 200 | 280 |所以在应用了一些数学之后
{120 = a*1 + b
{200 = a*2 + b 我们可以看出f(line)是80 * line + 40。
现在我们需要找出其余元素的公式。
这很容易,因为我们知道它是通过2增加的,这意味着它是某种形式的firstValue + 2*(positionInLine -1)。
最后一个问题是如何决定每行应该打印多少个值?
如果您仔细查看您的数据,您将看到每行包含与行号相同的值。因此,我们应该继续以长position<=line的形式打印值。
所以我们的最终解决方案看起来
for (int line = 1; line <= 9; line++) {
int firstValueInCurrentLine = 80 * line + 40;
for (int position = 1; position <= line; position++) {
System.out.print(firstValueInCurrentLine + 2 * (position -1) + " ");
}
System.out.println();
}发布于 2015-07-06 21:04:15
没有测试,只使用我的大脑:
for(int i=0;i<input;i++){
int firstNumber = 120+80*i;
for(int j=0;j<=i;j++){
System.out.print(firstNumber+2*i*j); //optimalization firstNumber+(i*j<<1)
}
System.out.println();
}编辑输入
input变量是行的计数
可以从命令行将变量作为参数传递,例如:
public static void main(String[] args){
int input=5; //default value
try{
input=Integer.valueOf(args[0]); //trying to get integer from command line
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Missing parameter");
}catch(Exception e){
System.out.println("First parameter is not an integer");
}
//input variable is now parameter or 5 by default
for(int i=0;i<=input;i++){
int firstNumber = 120+80*i;
for(int j=0;j<i;j++){
System.out.print(firstNumber+2*i*j);
}
System.out.println();
}
}编辑解释
第一个数字是第一列中的变量,如果要按i变量计数,您将看到以下顺序:
120, 200, 280, 360, 340, ...这确实是第一列。
然后,您应该解决下一列,正如您所看到的,在每一行中,差异分别是+2,而每列也是+2,因此2*i*j解决了这个问题。
发布于 2015-07-06 21:07:30
public class Triangle {
public static void main(String [] args) {
int base_int = 40;
for (int row = 1; row < 10; row++) {
for (int col = 0; col < row; col++) {
int result = base_int + (80 * row) + (2 * (row - 1) * col);
System.out.print(result);
System.out.print(" ");
}
System.out.println();
}
}
}https://stackoverflow.com/questions/31255495
复制相似问题