L1-002 打印沙漏 分数 20 作者 陈越 单位 浙江大学
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
#include<stdio.h>
int main(){
int a = 1;
char b = '*';
//输入的数字和字符
int spot = 1; //参与组成沙漏的点数,默认参与为一个点
int temp = 1; //每一行的点数
int count = 1; //确定三角形的行数
int remain = 0; //余下未使用的点
scanf("%d %c",&a,&b);
while (spot < a && a >= spot + (temp + 2)*2 ){
//如果使用点数是比输入的点数少且比总点数加下一行的点数大,则执行循环
count ++ ; //有多少行
temp += 2; //这一行点数加2
spot += temp*2; //把这一行点数*2之后在和目前统计的点数相加
}
remain = a - spot;//用输入的点数减去统计的点数得到多余的点数
for(int i1 = count ; i1 > 1 ; i1--){
for (int i2 = 0 ; i2 < count - i1 ; i2++ ){
printf(" ");
}
for (int i3 = 0 ; i3 < i1*2-1 ; i3 ++){
printf("%c",b);
}
printf("\n");
}
for(int i1 = 1 ; i1 <= count ; i1 ++){
for (int i2 = 0 ; i2 < count - i1 ; i2++ ){
printf(" ");
}
for (int i3 = 0 ; i3 < i1*2-1 ; i3 ++){
printf("%c",b);
}
if(i1 != count) {
printf("\n");
}
}
printf("\n");
printf("%d",remain);
}