L1-002 打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
import java.util.*;
public class Main {
public static void main(String args[]) {
int a=0,b,c=1,s=1,i=1,n;
String m = null;
Scanner sc=new Scanner(System.in);
if(sc.hasNext()) {
a=sc.nextInt();
m=sc.next();
sc.close();
}
b=(a-1)/2+1;//计算沙漏下半部分可使用的符号总数(包括中心点)
while((s+c+2)<=b){
c=c+2;
s=s+c;
i++;//s为累计已使用的符号数,i为层数,c为每层的符号数;
}
String p[]=new String[i];//数组用于存储每层的符号(包括空格)
for(int l=0;l<i;l++) {
p[l]="";//初始化
}
int k=(c-1)/2;//k为最底层的最左符号到整个沙漏对称轴的距离
int o=0;
for(int j=0;j<i;j++) {
o=j;//o为当前行的最左符号到对称轴距离,而每层加2相当于左右两侧各加1
for(int l0=0;l0<k-o;l0++) {
p[j]=p[j]+" ";//k-o个空格
}
for(int l1=0;l1<o*2+1;l1++) {
p[j]=p[j]+m;//符号数为o*2+1
}
}
for(int j=i-1;j>0;j--) {//输出沙漏
System.out.println(p[j]);
}
for(int j=0;j<i;j++) {
System.out.println(p[j]);
}
System.out.println(a-s*2+1);
}
}
L1-003 个位数统计
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M
的格式在一行中输出该位数字 D
及其在 N 中出现的次数 M
。要求按 D
的升序输出。
import java.util.*;
public class Main {
public static void main(String args[]) {
String m=null;
int start=0;
Scanner sc=new Scanner(System.in);
if(sc.hasNext()) {
m=sc.next();
sc.close();
}
int a[]=new int[10];
for(int i=0;i<10;i++) {
a[i]=0;
}
for(int i=0;i<10;i++) {
while((start=m.indexOf(i+"",start))>=0) {
//int转String,其中m.indexOf(x,y)是从y开始检索x在m中出现的位置,这个循环即可得到x在m中出现的次数
start++;
a[i]=a[i]+1;
}
}
for(int i=0;i<10;i++) {
if(a[i]!=0) {
System.out.println(i+":"+a[i]);
}
}
}
}