c - 任何人都可以建议我为这种模式提供更好/更短的方法吗?
问题描述
4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4
对于这种模式,我想要一个更短的代码或更智能的代码。我的代码工作正常,但有点长。
我的代码
#include <stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=n;i>=1;i--)
{
for(j=n;j>i;j--)
{
printf("%d ",j);
}
for(j=1;j<(2*i)-1;j++)
{
printf("%d ",i);
}
for(j=i;j<=n;j++)
{
printf("%d ",j);
}
printf("\n");
}
for(i=2;i<=n;i++)
{
for(j=n;j>i;j--)
{
printf("%d ",j);
}
for(j=1;j<(2*i)-1;j++)
{
printf("%d ",i);
}
for(j=i;j<=n;j++)
{
printf("%d ",j);
}
printf("\n");
}
return 0;
}
解决方案
像这样怎么样:
#include <stdio.h>
#include <stdlib.h>
int max (int a, int b) {
return a > b ? a : b;
}
void pattern (int width) {
int count = width;
int digits = 1;
while (count /= 10)
++digits;
for (int line = 0; line < (2*width-1); ++line) {
for (int col = 0; col < (2*width-1); ++col) {
int val = max (abs (1+line-width)+1, abs (1+col-width)+1);
if (col > 0)
putc (' ', stdout);
printf ("%*d", digits, val);
}
puts ("");
}
}
int main (int argc, char* argv []) {
int width = argc > 1 ? atoi (argv [1]) : 4;
pattern (width);
}
这个想法是遍历所有位置,计算到 X 和 Y 方向中间位置的距离,并取其中的最大值。
推荐阅读
- javascript - 使用脚本设置为选中的复选框
- c++ - 如何将外部代码包含到虚幻引擎 4 C++ 项目中
- python-3.x - Python3 - 插入许多不同长度的数组
- javascript - 在 React 的循环中新添加 div 重叠
- liquibase - 在 liquibase 中管理视图更新的推荐方法是什么?
- javascript - 在 jQuery 中多次单击显示/隐藏函数
- tomcat - 取消部署war文件后关闭数据库池连接
- jquery - 如何让 Parsley JS 验证在 Tiny MCE 富文本区域上工作?具体来说,如何通知 Parsley.js 对 Tiny MCE 的更改?
- html - 围绕圆形 div 环绕文本的问题
- python - 使用数据类初始化对象时修改属性