[英]Java Programming Code
我試圖產生以下結果:
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(其中i行號從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?
謝謝
未經測試,僅使用我的大腦:
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
解決了這個問題
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();
}
}
}
嘗試將問題分成不同的部分,例如
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();
}
for (int i = 0, m = 120; i < 9; ++i, m += 80) {
for (int j = 0, s = i + i, n = m; j <= i; ++j, n += s)
System.out.print(n + " ");
System.out.println();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.