本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
//本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
//*****
// ***
// *
// ***
//*****
//所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
//给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
//输入格式:
//输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
//输出格式:
//首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
//输入样例:
//19 *
//输出样例:
//*****
// ***
// *
// ***
//*****
//2
#include <stdio.h>
int main(void)
{
//*****
// ***
// *
// ***
//*****
//沙漏拆两半,上面一半1 3 5 7 等差数列为:1 + (n-1)2 d为2 a1为1
//沙漏拆两半,下面一半3 5 7 9 等差数列为:3 + (n-1)2 d为2 a1为3
//输入一个数,定义一个变量和符号
int n;
char fh;
scanf("%d %c",&n,&fh);
//
//求出沙漏上下之和不大于这个数的个数,先分别数列求和
//sn1 + sn2 < n
//循环遍历求出这个n是几
//定义沙漏行数从1开始
int hs = 1;
//上三角数列和
int sn1 = 0;
//下三角数列和
int sn2 = 0;
//判断和不大于输入的值 n
while(sn1 + sn2 < n)
{
//数列求和公式
sn1 += 1 + (hs-1)*2;
sn2 += 3 + (hs-1)*2;
//增加行数
hs++;
}
//printf("%d\n",hs);
//3+6+6+2==17
//循环里会多增加一次循环,要减掉
hs-=1;
//判断画出的沙漏会不会多出给定值的范围
int num1 = (hs*1 + hs*(hs-1));
int num2 = ((hs-1)*3 + (hs-1)*((hs-1)-1));
// printf("%d %d\n",num1,num2);
//判断画出的沙漏会不会多出给定值的范围 ,多的话就减去一行
if((num1+num2) > n)
{
hs--;
}
//然后就可以循环遍历打印出沙漏了
int j,k,m;
int kg = 0;
int count = 0;
for(j = hs ;j >= 1;j--)
{
for(m = 0;m < kg;m++)
{
printf(" ");
}
for(k =0;k < (1 + (j-1)*2) ;k++)
{
printf("%c",fh);
count++;
}
kg++;
printf("\n");
}
kg -= 2;
for(j = 1;j<=hs-1;j++)
{
for(m = 0;m < kg;m++)
{
printf(" ");
}
for(k = 0;k < (3 + (j-1)*2) ;k++)
{
printf("%c",fh);
count++;
}
kg--;
printf("\n");
}
//计算出数量差
printf("%d",n-count);
return 0;
}