PAT L1-002 打印沙漏 (20 分)

刚开始学C语言时候做的题了,这个更像是一个数学问题,这两年的正赛中也很少碰到这类型的题目了

提示一些比我更萌的萌新,可以先不打印空格,先打印一些其他符号以观察自己规律的正确性

天梯赛中还发现了一个,如果想要读入一整行包含空格的字符串,如果开头就有空字符,需要在之前加一个getchar,之后用gets读,或者cin.getline读应该也差不多

题目链接

#include <stdio.h>
#include <string.h>
int main(void)
{
	//以下所有代码均为不等于1 的情况; 
	
	int v;
	char c;
	//输入环节 
	scanf("%d",&v);  
	getchar();
	scanf("%c",&c);
if(v  >= 7 ) { 
	//储存1000以内可能构成 
	int score;
	int n=1,i=0;
	int a[1000];
	while(score<=1000)
	{
		score = (2*n*n)+(4*n)+1;
		a[i] = score;
		n++;
		i++;
	}
	//for(i=0;i<50;i++)
	//{
	//	printf("%d\t",a[i]); 
	//}
	//数数剩余了几个字符没用 
	int last = 100;
	int t;
	for(i=0;i<n;i++)
	{
		t = v - a[i];
		if(t>0)
		{
			if(t<last){
			last = t;
			}
		}else if(t==0)
		{
			last = 0;
		 } 
	 } 
	 //printf("last = %d\n",last);
	 //printf("if last = 100")......
	 //真正使用的字符数量 
	 int real = v - last; 
	 //printf("%d",real);
	 
	 //求行数 
	 int f = 1;
	 int final = (real-1)/2;
	 while((f*f+2*f) != final)
	 {
	 	f++;
	  } 
	  //printf("%d",f);
	int o = f*2 + 1;
	int m = 0;
	int s,b;
	while(o>1){
		for(s=0;s<m;s++){
			printf(" ");
		}
		m++;
		for(b=0;b<o;b++){
			printf("%c",c);
		}
		o -= 2;
		if(o>0){
		printf("\n");}
	} 
	
	int g = 0;
	while(g<2*f+1)    
	{
		for(s=m;s>0;s--){
			printf(" ");
		}
		m--;
		for(b=0;b<=g;b++){
			printf("%c",c);
		}
		g += 2;
		printf("\n");
	 } 
	 // 如何能不输出第一行的* 
	 //if(last!=0){
	 printf("%d",last);//}
	 } 
	 else if(v<7){
	 
	 	printf("%c\n%d",c,v-1); 
	 } 
	 
 
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值