解题思路:
观察图像可得以下结论:
1.能构成沙漏的数字有: 7、17、31、49......
2.前后每个构成沙漏的大数减小数的差值为等差数列:10、14、18、22.....
此等差数列的前n项和公式为8*n+2*n*n;
因此根据数学关系可得任意两个沙漏的数值差为它们之间的等差数值的加和。
根据数学知识可得第n个(n初值取1)构成沙漏的数的表达式为8*n+2*n*n+7。
因此在程序中可以利用循环语句找到与输入个数最接近的沙漏数。
将此沙漏拆分为上下两部分进行输出,注意循环条件。
注意:
在PTA中提交的时候以下代码为需要额外注意的地方。其在1测试点中进行测试,若不注意则将部分正确。
if(n<=0)return 0;
程序分为 大部分:
1.计算与输入数字最接近的沙漏符号总数。
2.计算剩余个数。
3.计算沙漏两头的符号个数。
4.利用循环分别打印上下两部分。
程序结果如下:
#include<iostream>
using namespace std;
int main()
{int n;
char a[100];
cin>>n>>a;
if(n<=0)return 0;
int i=0;
while((8*i+2*i*i+7)<=n)
{i++;
}
i--;
int remain;
remain=n-(8*i+2*i*i+7);
int usingwood=8*i+2*i*i+7;
int end=1,sum=0;
while(sum!=(usingwood-1)/2)
{end+=2;
sum+=end;
}
i=end;
while(i>=1)
{for(int j=0;j<((end-i)/2);j++)
{cout<<" ";
}
for(int j=0;j<i-1;j++)
{cout<<a[0];
}
cout<<a[0]<<endl;
i=i-2;
}
i=3;
while(i<=end)
{for(int j=0;j<(end-i)/2;j++)
{cout<<" ";
}
for(int j=0;j<i-1;j++)
{cout<<a[0];
}
cout<<a[0]<<endl;
i=i+2;
}
cout<<remain;
}