首页 > 试题广场 >

打印沙漏(20)

[编程题]打印沙漏(20)
  • 热度指数:20803 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递
增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入描述:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。


输出描述:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
示例1

输入

19 *

输出

*****
 ***
  *
 ***
*****
import java.util.Scanner;
public class Main{
 public static void main(String[] args) {
  Scanner in=new Scanner(System.in);
     int n=in.nextInt();
     char p=in.next().charAt(0);
     int yu=0;
     int yibian=0;
     for(int i=0;i<Math.sqrt(n);i++) {
      if((2*i*i+4*i+1)<=n&&(2*(i+1)*(i+1)+4*i+5)>n) {
       yibian=i;
       yu=n-(2*i*i+4*i+1);
       break;
      }
     }
     for(int i=0;i<yibian;i++) {
      for(int j=0;j<i;j++) {
       System.out.print(" ");
      }
      for(int j=0;j<2*(yibian-i)+1;j++) {
       System.out.print(p);
      }
      System.out.println();
     }
     for(int i=0;i<yibian;i++) {
      System.out.print(" ");
     }
     System.out.println(p);
     for(int i=yibian;i>0;i--) {
      for(int j=0;j<i-1;j++) {
       System.out.print(" ");
      }
      for(int j=0;j<2*(yibian-i+1)+1;j++) {
       System.out.print(p);
      }
      System.out.println();
     }
     System.out.println(yu);
 }
}

发表于 2019-03-20 22:43:59 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
         
        String[] parameters = bufferedReader.readLine().split(" ");
        int N = Integer.parseInt(parameters[0]);
        char symbol = parameters[1].charAt(0);
         
        int n = 0;
         
        while((2 * n * n - 1) <= N) {
            n++;
        }
        n--;
         
        int maxLineSymbolCount = 2 * n - 1;
         
        StringBuilder symbolString = new StringBuilder(maxLineSymbolCount);
        StringBuilder spaceString = new StringBuilder(maxLineSymbolCount / 2);
         
        for(int i = 0; i < maxLineSymbolCount; i++) {
            symbolString.append(symbol);
        }
        for(int i = 0; i < maxLineSymbolCount / 2; i++) {
            spaceString.append(' ');
        }
         
        for(int i = 1; i <= n; i++) {
            int symbolCount = (2 * (n - i + 1) - 1);
            int spaceCount = maxLineSymbolCount - symbolCount;
            System.out.println(spaceString.substring(0, spaceCount/2) +
                    symbolString.substring(0, symbolCount));
        }
        for(int i = 2; i <= n; i++) {
            int symbolCount = (2 * i - 1);
            int spaceCount = maxLineSymbolCount - symbolCount;
            System.out.println(spaceString.substring(0, spaceCount/2) +
                    symbolString.substring(0, symbolCount));
        }
        System.out.println(N - (2 * n * n - 1));
    }
}

编辑于 2017-11-20 16:36:48 回复(0)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Standard();
}
public static void Standard() {
Scanner sc = new Scanner(System.in);
int sum  = 0;
int c = 0;
int i = 3; //每行个数
int m = 3;
int a = sc.nextInt(); //字符个数
char b = sc.next().charAt(0);//字符
for(; ;i+=2) {
sum +=i;
c++;
if((a-1)/sum == 2) {
break;
}
}
int o = i;
for(int j =0;j<c+1;j++) {
for(int k = 0;k<j;k++) {
System.out.print(" ");
}
for(int l = 0;l<o;l++) {
System.out.print(b);
}
o-=2;
System.out.println();
}
for(int j =0;j<c;j++) {
for(int k = 0;k<(i-m)/2;k++) {
System.out.print(" ");
}
for(int l = 0;l<m;l++) {
System.out.print(b);
}
m+=2;
System.out.println();
}
System.out.println((a-1)%sum);
}
}
哪位大佬试试我的  我输出格式是对的  为什么提交就是报错
发表于 2017-08-05 14:39:50 回复(1)

问题信息

难度:
3条回答 31380浏览

热门推荐

通过挑战的用户

打印沙漏(20)