这个代码刚学C语言的时候写的,我记得当时的题目要求是 输入一个数n和一个符号c 然后问用n个符号c打印出一个沙漏还差多少或者是多多少 下面还有其他两个直接打印沙漏的方法
#include#includeint main()
{
printf("请输入一个正整数和一个符号:");
int a;
char b;
scanf("%d %c",&a,&b);
if(a>1000||a<1) return 0;
int i=1,c=1,d=1;
if(a<3) printf("%c\n%d",b,a-1);
else
while(a>c)
{
i=i+2;
d=c;
c=c+2*i;
}
i=i-2;
int m=i;
int j=0;//打印沙漏前半段
while(i>=1)
{
for(int k=1;k<=j;k++)
{
printf(" ");
}
for(int n=1;n<=i;n++)
{
printf("%c",b);
}
printf("\n");
i=i-2;
j=j+1;
}
//打印沙漏后半段
j=j-2;
i=i+4;
while(j>=0)
{
for(int t=1;t<=j;t++)
{
printf(" ");
}
for(int h=1;h<=i;h++)
{
printf("%c",b);
}
printf("\n");
j=j-1;
i=i+2;
}
printf("\n%d",a-d);
}
经典方法 分开先打印上面然后是下面
#includeint main()
{
int a,i,j,k;
for(i=1;i<=3;i++)//控制上面图形的行数
{
for(j=1;j<=3-i;j++)//控制空格
{
printf(" ");
}
for(k=1;k<=2*i-1;k++)//控制符号
{
printf("*");
}
printf("\n");//控制换行
}
for(i=2;i>=1;i--)//下面图形的行数
{
for(j=1;j<=3-i;j++)//控制空格
{
printf(" ");
}
for(k=1;k<=2*i-1;k++)//控制符号
{
printf("*");
}
printf("\n");
}
return 0;
}
延伸_找规律打印沙漏
#include#includeint main()
{
int i,j;
for(i=1;i<=5;i++)//控制总行数
{
for(j=1;j<=5;j++)//控制每行要输出的
{
if(fabs(i-3)>=fabs(j-3))//利用规律找出列与行到最中间的距离之差打印
printf("*");//如果
else
printf(" ");
}
printf("\n");
}
return 0;
}
第二种图形
第一种情况每个字符后面不跟空格
#include#includevoid shalou(int n,char c)
{
int i,j,k,p;
for(i=0,p=n;i0;k--)
{
printf("%c",c);
}
printf("\n");
}
for(i=n-2,p=2;i>=0;i--,p++)
{
for(j=0;j=n) break;
}
if(i*i*2-1>n)
{
i--;
yu=n-(i*i*2-1);
}
shalou(i,c);
printf("%d",yu);
}
第二种规律思路不过后面有多余空格 OJ提交的话无法通过不过上面那种情况可以
#include#includevoid shalou(int n,char c)
{
int i,j,k,p;
for(i=1;i<=2*n-1;i++)
{
for(j=1;j<=2*n-1;j++)
{
if(fabs(i-n)>=fabs(j-n)) printf("%c",c);
else printf(" ");
}
printf("\n");
}
}
int main()
{
int n,i,yu;
char c;
scanf("%d %c",&n,&c);
for(i=1;;i++)
{
if(i*i*2-1>=n) break;
}
if(i*i*2-1>n)
{
i--;
yu=n-(i*i*2-1);
}
shalou(i,c);
printf("%d",yu);
}