题目描述:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印: 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
输出样例:
前提建议:
为了便于理解最好先看一下这篇使我受到启发的文章:输出自定义大小的沙漏(在本文中为被调用函数fact1),可以注意到题目中的“大小 ”指的是沙漏中包含的其中一个三角形的行数n ,再结合题目要求,找到给定任意符号个数N 和n的数学关系即可。寻找过程此处不再赘述。
主要代码:
fact1(打印题目要求的沙漏):
为了代码的简洁,我将它单独作为一个函数,然后在主函数中调用即可。
void fact1(int n,char m)
{
int i,j;
for(i=n;i>0;i--){
for(j=1;j<=n-i;j++){
printf(" ");
}
for(j=1;j<=2*i-1;j++){
printf("%c",m);
}
printf("\n");
}
int a,b;
for(a=2;a<=n;a++){
for(b=1;b<=n-a;b++){
printf(" ");
}
for(b=1;b<=2*a-1;b++){
printf("%c",m);
}
printf("\n");
}
}
fact2(由N找到n):
学会打印沙漏之后,任意符号数N和n的数学关系成为关键。我们发现:
当n=1时,N=1; 当n=2时,N=7; 当n=3时,N=17; 当n=4时,N=31; 即满足 n*n = (N+1)/2 的数学关系。
显然,由题目给的已知的N求出的n可能会是小数,此时我们只需向下取整即可。
int fact2(double a)
{
double b;
int c;
b = sqrt((a+1)/2);
c = b;
return c;
}
- 注意:
在使用sqrt()函数时,数据应都为double类型,用%lf表示。
main()函数:
sum即N,symbol是任意符号,p为n; 用fact2求出p,p再作为参数用于fact1和fact3。
int main()
{
double sum;
int symbol,p;
scanf("%lf %c",&sum,&symbol);
p = fact2(sum);
fact1(p,symbol);
fact3(sum,p);
return 0;
}
最后是完整代码:
#include <stdio.h>
#include <math.h>
void fact1(int n,char m)
{
int i,j;
for(i=n;i>0;i--){
for(j=1;j<=n-i;j++){
printf(" ");
}
for(j=1;j<=2*i-1;j++){
printf("%c",m);
}
printf("\n");
}
int a,b;
for(a=2;a<=n;a++){
for(b=1;b<=n-a;b++){
printf(" ");
}
for(b=1;b<=2*a-1;b++){
printf("%c",m);
}
printf("\n");
}
}
int fact2(double a)
{
double b;
int c;
b = sqrt((a+1)/2);
c = b;
return c;
}
int fact3(double sum,int p)
{
int gap;
gap = sum -(p*p*2-1);
printf("%d",gap);
}
int main()
{
double sum;
int symbol,p;
scanf("%lf %c",&sum,&symbol);
p = fact2(sum);
fact1(p,symbol);
fact3(sum,p);
return 0;
}
|