[英]Java Print number square with revolving numbers using nested for loops
/ *這里是完整的問題:
編寫一個名為printSquare的方法,該方法接受兩個整數參數(最小值和最大值),並以正方形模式打印介於min到max(含)范圍內的數字。 通過示例比通過解釋更容易理解正方形模式,因此請在下表中查看示例方法調用及其產生的控制台輸出。
正方形的每一行由最小和最大之間遞增整數的圓形序列組成。 每行打印此序列的不同排列。 第一行以min開頭,第二行以min +1開頭,依此類推。 當任何一行中的序列達到最大值時,它會回繞到最小值。
您可以假設方法的調用者將傳遞一個min和一個max參數,以使min小於或等於max。 * /
嗨,大家好,我有這個問題我無法解決。 調用此方法printSquare(1,5)
; 獲得此輸出:
12345
23451
34512
45123
51234
到目前為止,這是我的代碼。 我似乎無法讓前面的數字轉移到后面。
public static void printSquare (int startNum, int height){
if (startNum == height){
System.out.print(height);
return;
}
for (int i = startNum; i <= height; i++){
int max = startNum;
int j = i;
for (j = i; j <= height; j++){
System.out.print (j);
}
System.out.println();
}
}
如果您的內部循環以i
開頭,則必須以height + i
結束,而不僅僅是輸出要為正方形的height
,否則它將是一個三角形。 您想了解模運算符%
以確定除法的余數 ,以便處理“溢出”。
如果startNum != 1
則您給出的說明不清楚應如何處理“溢出”。
此外,如果height
實際上表示高度 (並且因為它表示printSquare為width ),則保護條件(startNum == height)
顯然是錯誤的。 我希望printSquare(4, 4)
能打印四行和四列,而不僅僅是一行和一列。 命名似乎有問題。 通常,這種警衛人員是可疑的。 算法代碼應該通用,以至於不需要分別處理這種特殊情況。
這是一個可能的實現,適用於情況printSquare(1, 5);
和printSquare(1, 1);
。 對於其他情況,您的說明還不夠清楚。
public class Main {
public static void main(final String... args) {
printSquare(1, 5);
printSquare(1, 1);
//printSquare(2, 6);
//printSquare(4, 4);
}
public static void printSquare(int startNum, int height) {
for (int i = startNum; i < startNum + height; i++) {
for (int j = i; j < height + i; j++) {
System.out.print((j - 1) % height + 1);
}
System.out.println();
}
System.out.println();
}
}
如果結束號不是僅由height
決定,而是由startNum + height - 1
,則可能的解決方案如下所示:
public static void printSquare(int startNum, int height) {
for (int i = startNum; i < startNum + height; i++) {
for (int j = 0; j < height; j++) {
System.out.print((j + i - startNum) % (height) + startNum);
}
System.out.println();
}
System.out.println();
}
提供使用lambdas的替代Java 8解決方案。 對於一個簡單的任務來說可能是一個過大的殺傷力
public static void printSquaresJava8(int x, int y) {
int count = y - x + 1;
IntStream sequence = (IntStream.rangeClosed(x, y).<Integer>flatMap(i -> IntStream.rangeClosed(i, i + y).limit(count).<Integer>map(j -> j > y ? j - count : j)));
List<Integer> numbers = sequence.boxed().collect(Collectors.<Integer>toList());
IntStream.<Integer>rangeClosed(0,count-1).forEach(i ->
{numbers.subList(count * i, count + count*i).forEach(j -> System.out.print(j + " "));
System.out.println();
}
);
}
//用c ++編寫。 調用numberSquare(1,5),第一個for循環是您的行,第二個嵌套的for循環是您的列。 k從最小值開始。 col for循環將從最小值到最大值打印出k,在第一次迭代中,它將水平打印出1 2 3 4 5。 一旦k等於最大值,將其重置為最小值,以便外循環。 可以打印出從1到5的行。考慮它是像2D數組還是網格。
void numberSquare(int min, int max) {
for(int i = min; i <= max; i++) {
int k = i;
for(int j = min; j <= max; j++) {
cout << k;
if (k == max) {
k = min;
}
else k = k+1;
}
cout << endl;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.