java只用两个for循环输出N个菱形

qq_36405302 2016-10-15 01:16:24

这道题小弟完全没有思路,空格和星号都已经占了两个循环!如何只利用两个循环来做?我用字符数组弄出来了!但是老师说不能运用超前的知识!求帮忙!
附上运用字符数组实现代码:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要输出的行数:");
int a =scanner.nextInt();
String t[] = new String[6];
t[1] = " ";
t[2] = " **";
t[3] = " *****";
t[4] = " *******";
t[5] = "*********";
int i=1;
int flag=0;
int count=0;
do{
for(i=1;i<=5;i++){
if(count==a){
flag=1;
break;
}
count++;
System.out.println(t[i]);
}
for(int m=4;m>=2;m--){
if(count==a){
flag=1;
break;
}
count++;
System.out.println(t[m]);
}
}while(flag==0);
...全文
400 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bree06 2016-10-17
  • 打赏
  • 举报
回复
虽然已经结贴了, 但是还是打算发一个. 上面的判断修改了一下, 起始和结束可以指定基数等差数列.
public static void main(String[] args) {
    // 起始数, 最大数
    int a1 = 3, an = 9, max_line = 30; // 指定输出max_line行
    // 每一层的数量是一个等差数列1, 3, 5, 7, 9...所以这里直接算出个数
    int len = (a1 + an) * (an - a1) / 2 + a1, _len = len >> 1, line = 0;
    for (int c = a1, i = 0; ; ) {
        // 行尾
        if (c == i) {
            c = (len > _len) ? c + 2 : c - 2;
            i = 0;
            // 在行尾判断是否已经到输入的行数了
            if (line >= max_line)
                break;
        }
        // 行初补空格
        if (i++ == 0) {
            int column;
            line++; // 行初修改行记录
            // 以下的判断是否需要在行首补空格, 最长的行是不需要补空格的
            if ((column = (an - c) >> 1) > 0)
                System.out.printf((line > 1 ? "\n%" : "%") + column + 'c', ' ');
            else System.out.println();
        }
        System.out.printf("%c", '*');
        // 一堆完结之后再重新开始
        if (--len < a1) len = _len << 1;
    }
}
bree06 2016-10-15
  • 打赏
  • 举报
回复
public static void main(String[] args) {
    // 起始数是1, 中间数是9
    int a0 = 1, an = 9, max_line = 30;
    // 每一层的数量是一个等差数列1, 3, 5, 7, 9...所以这里直接算出个数
    int len = (((((a0 + an) >> 1) * ((a0 + an) >> 1))) << 1) - an, _len = len >> 1, line = 0;
    for (int c = a0, s = c, i = 0; ; ) {
        // 行尾
        if (c == i) {
            c = (len > _len) ? c + 2 : c - 2;
            s = (c + 1) >> 1;
            i = 0;
            // 在行尾判断是否已经到输入的行数了
            if (line >= max_line)
                break;
        }
        // 行初补空格
        if (i++ == 0) {
            int column;
            line++; // 行初修改行记录
            // 以下的判断是否需要在行首补空格, 最长的行是不需要补空格的
            if ((column = ((a0 + an) >> 1) - s) > 0) {
                if (line > 1) System.out.print('\n');
                for (int j = 0; j < column; j++)
                    System.out.print(' ');
            }
            else System.out.println();
        }
        System.out.printf("%c", '*');
        s++;
        // 一堆完结之后再重新开始
        if (--len <= 0)
            len = _len << 1;
    }
}
注释上面都有, 当然一个for也是可以完成任务的, 只需要将
if ((column = ((a0 + an) >> 1) - s) > 0) {
    //System.out.printf((line > 1 ? "\n%" : "%") + column + 'c', ' ');
    if (line > 1) System.out.print('\n');
    for (int j = 0; j < column; j++)
        System.out.print(' ');
}
改为
if ((column = ((a0 + an) >> 1) - s) > 0) {
    System.out.printf((line > 1 ? "\n%" : "%") + column + 'c', ' ');
}
输出多个空格可以直接使用System.out.printf("%4c", ' ');这样就会输出4个空格
qq_36405302 2016-10-15
  • 打赏
  • 举报
回复
好的!谢谢了!
一度人生 2016-10-15
  • 打赏
  • 举报
回复
import java.util.Scanner; public class LingXing12 { public static void main(String[] args) { @SuppressWarnings("resource") Scanner scanner = new Scanner(System.in); System.out.print("请输入要输出的行数:"); int counter =scanner.nextInt(); int num=0; while(num<counter){ for (int i = 0; i < 9; i++) { if (i<= 4) { int a=0; while( a<4-i){ System.out.print(" "); a++; } int b=0; while( b<2*i+1){ System.out.print("*"); b++; } num++; if(num>=counter){ break; } } else { int c=0; while( c<i-4){ System.out.print(" "); c++; } int d=0; while( d<17-2*i){ System.out.print("*"); d++; } num++; if(num>=counter){ break; } } System.out.println(); } } } } 同学刚学没多久吧!我也在学,可能比你早些时间。这题使用了三层嵌套语句,但我用了一个for语句(有些for语句可以和while语句相互转换),真正应用很少使用三层嵌套。不知道符不符合要求,希望对你有帮助。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧