题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int odd[600] = {0};
//生成奇数
void create_odd() {
odd[0] = 1;
for (int i = 1, j = 3; i < 600; i++, j += 2)
odd[i] = j;
}
int main()
{
int n;
char c;
cin >> n>>c;
if (n == 1)
cout << c<<endl<<0;//参照网上的前辈指导,这里是测试点1,2的考察处
else {
create_odd();
int m[100] = { 0 };
m[0] = 1;
int i;
for (i = 1; i < 80; i++) {
m[i] = m[i - 1] + 2 * odd[i];
if (n < m[i])
break;
}
int remain = n - m[i - 1];//剩余的材料个数
//输出图形:
int ceng = i - 1;
for (int j = ceng; j >= 0; j--)
{
for (int f = 0; f < ceng - j; f++)
printf(" ");
for (int k = 0; k < odd[j]; k++)
printf("%c", c);
printf("\n");
}
for (int j = 1; j <= ceng; j++)
{
for (int f = 0; f < ceng-j; f++)
printf(" ");
for (int k = 0; k < odd[j]; k++)
printf("%c", c);
printf("\n");
}
cout << remain << endl;
}
}
二刷:(一开始判断符号总个数是抄的,后面是凑出来的)
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main(){
int n;
char c;
cin>>n>>c;
bool flag=true;
int csum=-1,sum=0,k=-1,i,j;
for(i=0;sum<=n;i++){
csum=sum;
sum=csum+(2+k)*2;
k+=2;
}
if(n==1){
printf("%c\n0",c);
flag=false;
}
int row=i,num=k;
for(i=1;i<row;i++){
for(j=1;j<i;j++)
printf(" ");
for(j=0;j<num-2;j++)
printf("%c",c);
printf("\n");
num-=2;
}
row-=1;
num+=2;
for(i=1;i<row;i++){
for(j=1;j<row-i;j++)
printf(" ");
for(j=0;j<num;j++){
printf("%c",c);
}
printf("\n");
num+=2;
}
if(flag)
printf("%d",n-csum+1);
}