C 有人能为我推荐一种更好/更短的方法来处理这种模式吗?

C 有人能为我推荐一种更好/更短的方法来处理这种模式吗?,c,loops,for-loop,pattern-matching,conditional-statements,C,Loops,For Loop,Pattern Matching,Conditional Statements,4 4 3 4 43234 431234 43234 4 3 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("

4
4 3 4
43234
431234
43234
4 3 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;
}
#包括
int main()
{
int n,i,j;
scanf(“%d”和“&n”);
对于(i=n;i>=1;i--)
{
对于(j=n;j>i;j--)
{
printf(“%d”,j);
}
对于(j=1;j这样怎么样:

#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);
}
#包括
#包括
最大整数(整数a,整数b){
返回a>b?a:b;
}
空心图案(整型宽度){
整数计数=宽度;
整数位数=1;
while(count/=10)
++数字;
对于(int行=0;行<(2*宽度-1);+行){
对于(整数列=0;列<(2*width-1);+col){
int val=max(abs(1+线宽)+1,abs(1+列宽)+1);
如果(列>0)
putc(“”,stdout);
printf(“%*d”,数字,val);
}
认沽权(“”);
}
}
int main(int argc,char*argv[]){
int width=argc>1?原子(argv[1]):4;
图案(宽度);
}
我们的想法是在所有位置上循环,计算X和Y方向到中间位置的距离,并取最大值。

这样如何:

#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);
}
#包括
#包括
最大整数(整数a,整数b){
返回a>b?a:b;
}
空心图案(整型宽度){
整数计数=宽度;
整数位数=1;
while(count/=10)
++数字;
对于(int行=0;行<(2*宽度-1);+行){
对于(整数列=0;列<(2*width-1);+col){
int val=max(abs(1+线宽)+1,abs(1+列宽)+1);
如果(列>0)
putc(“”,stdout);
printf(“%*d”,数字,val);
}
认沽权(“”);
}
}
int main(int argc,char*argv[]){
int width=argc>1?原子(argv[1]):4;
图案(宽度);
}

其想法是在所有位置循环,计算X和Y方向到中间位置的距离,并取最大值。

我可以建议以下解决方案。享受吧!)

实际上,只使用了两个循环来输出模式本身

for ( int i = 0; i < m; i++ ) 
{ 
    for ( int j = 0; j < m; j++ ) 
    {
        int value1 = abs( n - i - 1 ) + 1;
        int value2 = abs( n - j - 1 ) + 1;

        printf( "%*d ", width, value1 < value2 ? value2 : value1 );
    } 
    putchar( '\n' ); 
}
for(int i=0;i
我可以建议以下解决方案。尽情享受吧!:)

实际上,只使用了两个循环来输出模式本身

for ( int i = 0; i < m; i++ ) 
{ 
    for ( int j = 0; j < m; j++ ) 
    {
        int value1 = abs( n - i - 1 ) + 1;
        int value2 = abs( n - j - 1 ) + 1;

        printf( "%*d ", width, value1 < value2 ? value2 : value1 );
    } 
    putchar( '\n' ); 
}
for(int i=0;i
你能解释一下你的模式是如何依赖于
n
作为用户输入的。我投票把这个问题作为离题题来结束,因为它属于你,你可以删除一对对
{}
对。如果你想“干净”的话,这是代码高尔夫吗不是绝对最小字节数的解决方案?能否请您解释一下您的模式如何依赖于用户输入的
n
。我投票将此问题作为离题题结束,因为它属于您,您可以删除一对
{}
对。如果您想要“干净”的话,这是code golf吗不是绝对最小字节数的解决方案?您可能希望为大小写
width>=10
添加填充,例如使用
printf(“%*d”,digitCount,val)
其中
digitCount
宽度的数字计数
好主意;已添加。您可能希望为
width>=10的案例添加填充,例如使用
printf(“%*d”,digitCount,val)
where
digitCount
是宽度的数字计数
好主意;补充。你在解决这个问题时采用了什么方法,你是如何想出这个主意的?还有,它们做了什么?1.if((scanf(“%d”,&n)!=1)…)和2.printf(“%*d”,…)@GautamGoyal这句话if((scanf(“%d,&n)!=1)检查输入是否成功,即是否读取了1个数据。在此语句中,printf(“%*d”,宽度,value1