【问题标题】:Advanced Number Pattern高级数字模式
【发布时间】:2019-09-06 13:14:03
【问题描述】:

给定一个数字 N,打印以下模式。

输入格式

输入包含一个数字N

约束

1

输出格式

所需的模式 对于输入 5 是

1 
2 9 
3 8 10 
4 7 11 14 
5 6 12 13 15 

输入 3 是

1 
2 5 
3 4 6

这是我尝试过的代码..但结果不一样

#include<stdio.h>
void pattern(int n)
{
    for(int i=1; i<=n; i++)
    {
        int k = i;
        for(int j=1; j<=i; j++)
        {
            printf("%d ",k);
            k =  n - j + k;

        }
        printf("\n");
    }
}
int main()
{

    int n = 5;
    pattern(n);
    return 0;
}


这是上面代码的结果

1                                                                                                                                             
2 6                                                                                                                                           
3 7 10                                                                                                                                        
4 8 11 13                                                                                                                                     
5 9 12 14 15 

我应该如何修改上面的代码以获得预期的输出?

【问题讨论】:

  • 所需的图案结构不清晰,添加换行符更清晰。
  • 这是一个有趣的问题,而且不是一个简单的问题。我认为你将不得不有一个额外的变量,因为你在每一行中从左到右移动,跟踪偶数、奇数、偶数、奇数。在“偶数”列中,您执行您已经在做的事情,但在“奇数”列中,您必须以某种方式翻转事物,以便从下到上倒数。

标签: c loops for-loop while-loop numbers


【解决方案1】:

这是一个有趣的问题,而且不是一个简单的问题。我不会写程序来解决它(部分是因为我太懒了),但我可以描述我将如何解决它。

您已经有一个外部循环for(int i=1; i&lt;=n; i++) 用于倒数行数,还有一个内部循环for(int j=1; j&lt;=i; j++) 用于跨列计数。这两个都很好。

在内部循环中,我将测试if(j % 2 == 1)。如果j % 2 是 1,我们在奇数列中,并且我们想要倒数该列。但如果j % 2 为 0,我们就在偶数列中,我们必须以相反的方式进行。

首先,我将有一个变量,它应该是列顶部的数字(在 n=5 的情况下为 1、9、10、14 或 15)。我必须以两种不同的方式计算该数字,一种用于“奇数”列,另一种用于“偶数”列。

然后我会使用该数字作为基数来倒数奇数列,并向上计数。具体来说:我会在奇数列中添加i,但在偶数列中减去i。但实际上这并不完全正确,因为i 在列的顶部不是 1 而不是 1,所以我实际上必须添加或减去的是 ij 的某些函数。但我认为你可以解决这个问题。

【讨论】:

    【解决方案2】:

    这是我的三分钱。:)

    #include <stdio.h>
    
    int main(void) 
    {
        while ( 1 )
        {
            const unsigned int UPPER_LIMIT = 100;
    
            printf( "Enter a non-negative number no greater than %u (0 - exit): ",
                    UPPER_LIMIT );
    
            unsigned int n;
    
            if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
    
            if ( !( n < UPPER_LIMIT ) ) n = UPPER_LIMIT - 1;
    
            putchar( '\n' );
    
            for ( unsigned int i = 0; i < n; i++ )
            {
                for ( unsigned int j = 0; j < i + 1; j++ )
                {
    
                    unsigned int value = j % 2 == 0
                        ? i + 1 + j * n - j * ( j + 1 ) / 2
                        : ( j + 1 ) * n - j * ( j + 1 ) / 2 - i + j;
    
                    printf( "%2u ",  value );               
                }
    
                putchar( '\n' );
            }
    
            putchar( '\n' );
        }
    
        return 0;
    }
    

    程序输出可能如下所示

    Enter a non-negative number no greater than 100 (0 - exit): 10
    
     1 
     2 19 
     3 18 20 
     4 17 21 34 
     5 16 22 33 35 
     6 15 23 32 36 45 
     7 14 24 31 37 44 46 
     8 13 25 30 38 43 47 52 
     9 12 26 29 39 42 48 51 53 
    10 11 27 28 40 41 49 50 54 55 
    
    Enter a non-negative number no greater than 100 (0 - exit): 9
    
     1 
     2 17 
     3 16 18 
     4 15 19 30 
     5 14 20 29 31 
     6 13 21 28 32 39 
     7 12 22 27 33 38 40 
     8 11 23 26 34 37 41 44 
     9 10 24 25 35 36 42 43 45 
    
    Enter a non-negative number no greater than 100 (0 - exit): 8
    
     1 
     2 15 
     3 14 16 
     4 13 17 26 
     5 12 18 25 27 
     6 11 19 24 28 33 
     7 10 20 23 29 32 34 
     8  9 21 22 30 31 35 36 
    
    Enter a non-negative number no greater than 100 (0 - exit): 7
    
     1 
     2 13 
     3 12 14 
     4 11 15 22 
     5 10 16 21 23 
     6  9 17 20 24 27 
     7  8 18 19 25 26 28 
    
    Enter a non-negative number no greater than 100 (0 - exit): 6
    
     1 
     2 11 
     3 10 12 
     4  9 13 18 
     5  8 14 17 19 
     6  7 15 16 20 21 
    
    Enter a non-negative number no greater than 100 (0 - exit): 5
    
     1 
     2  9 
     3  8 10 
     4  7 11 14 
     5  6 12 13 15 
    
    Enter a non-negative number no greater than 100 (0 - exit): 4
    
     1 
     2  7 
     3  6  8 
     4  5  9 10 
    
    Enter a non-negative number no greater than 100 (0 - exit): 3
    
     1 
     2  5 
     3  4  6 
    
    Enter a non-negative number no greater than 100 (0 - exit): 2
    
     1 
     2  3 
    
    Enter a non-negative number no greater than 100 (0 - exit): 1
    
     1 
    
    Enter a non-negative number no greater than 100 (0 - exit): 0
    

    或者使用递归方法计算输出值,程序可以如下所示。

    #include <stdio.h>
    
    int main(void) 
    {
        while ( 1 )
        {
            const unsigned int UPPER_LIMIT = 100;
    
            printf( "Enter a non-negative number no greater than %u (0 - exit): ",
                    UPPER_LIMIT );
    
            unsigned int n;
    
            if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
    
            if ( !( n < UPPER_LIMIT ) ) n = UPPER_LIMIT - 1;
    
            putchar( '\n' );
    
            for ( unsigned int i = 0; i < n; i++ )
            {
                unsigned int value = i + 1; 
                for ( unsigned int j = 0; j < i + 1; j++ )
                {
                    printf( "%2u ",  value );
                    value += j % 2 == 0 ? 2 * ( n - i ) - 1 : 2 * ( i - j  ); 
                }
    
                putchar( '\n' );
            }
    
            putchar( '\n' );
        }
    
        return 0;
    }
    

    例如,输入的数字等于 10 的输出看起来像

    Enter a non-negative number no greater than 100 (0 - exit): 10
    
     1 
     2 19 
     3 18 20 
     4 17 21 34 
     5 16 22 33 35 
     6 15 23 32 36 45 
     7 14 24 31 37 44 46 
     8 13 25 30 38 43 47 52 
     9 12 26 29 39 42 48 51 53 
    10 11 27 28 40 41 49 50 54 55 
    
    Enter a non-negative number no greater than 100 (0 - exit): 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多