【问题标题】:How to reduce the number of tokens for this C program如何减少此 C 程序的令牌数量
【发布时间】:2021-11-21 18:11:43
【问题描述】:

我编写了一个程序,该程序将数字(整数)作为输入,并使用 for 循环输出 1 和 0 的模式。例如当输入为7时,输出为:

1 
1 1 
1 0 1 
1 0 0 1 
1 0 0 0 1 
1 0 0 0 0 1 
1 1 1 1 1 1 1

源码如下:

#include <stdio.h>
int main()
{
    int rows;
    int i,j;
    scanf("%d", &rows);
    for(i=0;i<rows;i++)
    {
        for(j=0;j<=i;j++)
        {
            if(i==j)
            {
                printf("1 \n");
            }
            else if(j==0)
            {
                printf("1 ");
            }
            else if (i==rows-1)
            {
                printf("1 ");
            }
            else
            {
                printf("0 ");
            }
       }
    }
   return 0;
}

当我编译 codem 时,创建的令牌数为 107。我需要将令牌数减少到 102 以下(以满足测试要求)。

请问有什么建议吗?

【问题讨论】:

  • “令牌”是什么意思?您有什么要求?你的任务是什么?也请花一些时间阅读the help pages,阅读SO tour,阅读How to Ask,以及this question checklist。最后请学习如何edit您的问题以改进它们。
  • 你的意思是......源代码中的令牌数?如果是这样,我很抱歉,但这是有史以来最愚蠢的任务。
  • @Someprogrammerdude:“令牌”在 C 2018 6.4 中定义 1. 要求少于 102 个令牌。任务是编写一个程序,以整数作为输入,并产生 n 行输出,其中 i 行有 i 个数字,1 ≤ i ≤ n,有空格如图,每行第一个和最后一个数字为1,第n行的每个数字为1,其他所有数字为0。这些都清楚从帖子,所以我不知道你为什么问他们。
  • 你的教授是code golf的爱好者吗?
  • 删除除第一个和最后一个之外的每个{},分别删除12 个标记,然后你就完成了。

标签: c token


【解决方案1】:

检查一下:

int main(void)
{
    int rows;
    scanf("%d", &rows);
    for(int i=0;i<rows;i++)
        for(int j=0;j<=i;j++)
            printf(i == j ? "1 \n" : !j || i == rows - 1 ? "1 " : "0 ");
}

https://godbolt.org/z/3re3beW8W

甚至:

int main(void)
{
    int rows;
    scanf("%d", &rows);
    for(int i=0;i<rows;i++,putchar('\n'))
        for(int j=0;j<=i;j++)
            printf(!j || i == rows - 1 || i == j ? "1 " : "0 ");
}

int main(void)
{
    int rows;
    scanf("%d", &rows);
    for(int i=0;i<rows;i++,putchar('\n'))
        for(int j=0;j<=i;j++)
            printf("%d ", !j || i == rows - 1 || i == j);
}

【讨论】:

    【解决方案2】:

    为什么不直接去掉 if-else 链中的大括号呢?那是 8 个令牌,这将使您低于您的要求。

    【讨论】:

      【解决方案3】:
        for(j=0;j<=i;j++){
                  if(i==j)
                      printf("1 \n");
                  else if(j==0 || i==row-1)
                      printf("1 ");
                  else
                      printf("0 ");
        }
      

      可以从您的代码中删除这么多令牌。

      【讨论】:

        【解决方案4】:

        我会这样写

        include <sdtio.h>
        
        int main( void )
        {
            while (1)
            {
                printf( "Enter a non-negative number (0 - exit): " );
                unsigned int n;
        
                if (scanf( "%u", &n ) != 1 || n == 0) break;
        
                putchar( '\n' );
        
                for (unsigned int i = 0; i < n; i++)
                {
                    for (unsigned int j = 0; j < i + 1; j++)
                    {
                        unsigned int value = i == 0 || i == n - 1 || j == 0 || j == i;
                        printf( "%d ", value );
                    }
                    putchar( '\n' );
                }
        
                putchar( '\n' );
            }
        }
        

        程序输出可能看起来像

        Enter a non-negative number (0 - exit): 1
        
        1
        
        Enter a non-negative number (0 - exit): 2
        
        1
        1 1
        
        Enter a non-negative number (0 - exit): 3
        
        1
        1 1
        1 1 1
        
        Enter a non-negative number (0 - exit): 4
        
        1
        1 1
        1 0 1
        1 1 1 1
        
        Enter a non-negative number (0 - exit): 5
        
        1
        1 1
        1 0 1
        1 0 0 1
        1 1 1 1 1
        
        Enter a non-negative number (0 - exit): 6
        
        1
        1 1
        1 0 1
        1 0 0 1
        1 0 0 0 1
        1 1 1 1 1 1
        
        Enter a non-negative number (0 - exit): 7
        
        1
        1 1
        1 0 1
        1 0 0 1
        1 0 0 0 1
        1 0 0 0 0 1
        1 1 1 1 1 1 1
        
        Enter a non-negative number (0 - exit): 0
        

        或者如果要减少token的数量那么

        #include <stdio.h>
        
        int main( void )
        {
            unsigned n = 0;
        
            scanf( "%u", &n );
        
            for (unsigned i = 0; i < n; i++)
            {
                for (unsigned j = 0; j < i + 1; j++)
                {
                    unsigned value = i % ( n - 1 ) == 0 || j % i == 0;
                    printf( "%d ", value );
                }
                putchar( '\n' );
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-17
          • 1970-01-01
          • 1970-01-01
          • 2011-08-07
          • 1970-01-01
          相关资源
          最近更新 更多