刚开始学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);
}
}