# 洛谷P5725 【深基4.习8】求三角形

【深基4.习8】求三角形

题目描述

模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。

输入格式

输入矩阵的规模,不超过 9 。

输出格式

输出矩形和正方形

样例 #1

样例输入 #1

4

样例输出 #1

01020304
05060708
09101112
13141516

      01
    0203
  040506
07080910

题目解析

题目大意:

  • 题目要求输入一个不大于9的自然数,程序输出一个4×4的矩阵(每个数占两位依次排列)和一个底4高4的下三角形(每个数占两位依次排列),两图形间含一空行。

题目分析:

  1. 设输入的数为n,因n<9,故所有数均不会超过两位,问题的处理难度降低。

  2. 观察两个图形,矩形中每行四个数字,每个数字占两位;三角形中每行依次增加一个数字,且第k行前有2*(n-k)个空格。

  3. 对于矩形来说,输出1~n2共n2个数,对于三角形来说输出sum(1+2+···+n)个数,我们可以不考虑到底输出到了多少,只需要按照规则输出即可。

  4. 解决思路:可以使每个数字格式化输出两位数;对于矩形,当满足四个时输出一次回车;对于三角形,

    1. 思路1:每行输出2 * (n-k)个空格后输出一个格式化后的数,输出范围是1~2 *(n+1) ;
    2. 思路2:把每行当做一个要处理的整体,定义一个count计数器,按照规律输出并自增1 。对于这个下三角形,观察其特点:每行四个整体,为两个空格或一个两位数,那么便有:第一行有前三个是两个空格,最后一位是两位格式化的count。

代码题解

    #include 
    #include 
    using namespace std; 


    int main() 
    {
    int n;

    cin>>n;//输入行数 

    if(n>5||n<0)//异常处理 
    {
	    return 0;
    }

    else
    {
	    for(int i=1;i<n*n+1;i++)//从1到n^2输出
	    {
		    cout<<setfill('0')<<setw(2)<<i;
		    
		    if(i%n==0)//每n个数换一次行
		    {
			    cout<<endl;
		    }
	    }
	    
	    cout<<endl;
	    
	    int count=1;//三角形上每位要依次输出的数字
	    
	    for(int j=0;j<n;j++)//在共n行中
	    {
		    for(int k=0;k<n;k++)//在每行的n个数中
		    {
			    if(k<(n-j-1))//如果是下三角形之外的部分(比如第三行有一个部分是空格部分,三个部分是数字,则就有4-2-1=1个空格部分,且每个部分内是两个空格
			    {
				    cout<<"  ";
			    } 
			    else 
			    {
				    cout<<setfill('0')<<setw(2)<<count;//输出在本位置的数字
				    
				    count++;
			    }
			    
		    }
		    cout<<endl;
	    }
    }
    
    return 0;
    }
    

解法2:

    #include 

    using namespace std;

    int main()
    {
    int n,x=1;
    
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (x < 10)//当x不足两位数时用0补足
            {
                cout << "0";
                cout << x;
                x++;
            }
            else
            {
                cout << x;
                x++;
            }
        }
        cout << endl;
    }
    cout << endl;
        x = 0;
        for (int i = 0; i < n; ++i) 
        {
            for (int j = 0; j < (n - i - 1) * 2; ++j, cout << " ");//控制每行数字输出前面的空格数量的。在斜向上的数字三角形中,每一行数字输出之前都会有一定数量的空格,而这些空格的数量是逐渐减少的(每行减少2个)。
            
            for (int k = 0; k < (i + 1); ++k, ++x, printf("%02d", x));//来输出斜向上的数字三角形中的数字的。在斜向上的数字三角形中,每一行数字的数量是逐渐增加的(每行增加1个)。这个循环控制每行输出的数字数量,并且利用printf("%02d", x)来格式化输出数字,确保输出的数字始终占据两位位置,不足两位时在前面补零。++x用于将要输出的数字递增。
            
            cout << endl;
        }
    return 0;

    }

你可能感兴趣的:(C++必刷题,算法,c++,开发语言,leetcode)