解决前:
#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)
int main(void)
{
int N; char ch;
scanf("%d %c", &N, &ch);
int i;
int j;
int k;
int n;
for (i = 1; 2 * pow(i, 2) - 1 <= N; i++)//沙漏符号总数为2*n^2-1
{
//找出最大n
if (2 * pow(i, 2) - 1 > N)
n = i-1;
if (2 * pow(i, 2) - 1 <= N)
n = i;
}
for (i = 1; i <= n; i++)//输出倒三角形
{
for (j = 1; j < i; j++)
printf(" ");
for (k = 1; k <=2*(n-i)+1; k++)
printf("%c", ch);
printf("\n");
}
for (i = i-2; i >= 1; i--)
{
for (j = 1; j < i; j++)
printf(" ");
for (k = 1; k <= 2 * (n - i) + 1; k++)
printf("%c", ch);
printf("\n");
}
if (N > 2 * pow(n, 2) - 1)
printf("%0.f", N - (2 * pow(n, 2) - 1));
}
解决后:
#include<stdio.h>
#include<math.h>
#pragma warning(disable:4996)
int main(void)
{
int N; char ch;
scanf("%d %c", &N, &ch);
if (N < 7)
{
printf("%c\n%d", ch, N - 1);
return 0;
}
int i;
int j;
int k;
int n;
for (i = 1; 2 * pow(i, 2) - 1 <= N; i++)//沙漏符号总数为2*n^2-1
{
//找出最大n
if (2 * pow(i, 2) - 1 > N)
n = i-1;
if (2 * pow(i, 2) - 1 <= N)
n = i;
}
for (i = 1; i <= n; i++)//输出倒三角形
{
for (j = 1; j < i; j++)
printf(" ");
for (k = 1; k <=2*(n-i)+1; k++)
printf("%c", ch);
printf("\n");
}
for (i = i-2; i >= 1; i--)
{
for (j = 1; j < i; j++)
printf(" ");
for (k = 1; k <= 2 * (n - i) + 1; k++)
printf("%c", ch);
printf("\n");
}
if (N > 2 * pow(n, 2) - 1)
printf("%0.f", N - (2 * pow(n, 2) - 1));
}
原因:
测试点2卡N<7的特殊情况
当N<7时,应优化程序,无需判断后面的条件,使程序直接输出符号并换行输出N-1
if (N < 7)
{
printf("%c\n%d", ch, N - 1);
return 0;
}