编程语言
首页 > 编程语言> > C++打印实心菱形

C++打印实心菱形

作者:互联网

问题描述:
打印 n 阶实心菱形

输入描述:
输入一个整数n,0 < n <= 10

输出描述:
输出 n 阶实心菱形 , 占 2*n-1 行

示例:

样例输入		样例输出
   3			*
 			   ***
			  *****
 			   ***
			    *

法1:暴力破解法
(1)菱形可以看做是由4条边围成的图形,中学简单的线性规划可以用来解决这里的问题;
(2)但有所区别的是:在线性规划中,我们知道图形区域是连续的;而在这里的问题,打印出来的“*”是离散的;所以我们用n×n个字符来表示,调用两次for循环,满足条件即可输出。
在这里插入图片描述
(3)4条直线分别是:j=i+n,j=n-i,j=i-n,j=3n-i
只需满足:j<i+n,j>n-i,j>i-n,j<3n-i即可
这里是离散输出,不需要取等号。
代码如下:

#include<iostream>
using namespace std;

int main()
{

	int n = 0;
	cin >> n;
	//1、先打印2*n-1行
	//2、每行*由列数共同决定
	for (int i = 1; i <= 2 * n - 1; i++)
	{
		for (int j = 1; j <= 2 * n - 1; j++)
		{
			if (j<i + n && j>n - i && j<3 * n - i && j>i - n)
				cout << "*";
			else
				cout << " ";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

法2:
可以把图形分成上下两段,来分析行数与打印出来的空格及号之间的联系:上半段区间为1-—num;下半段区间为num+1—2num-1,为了方便计数转化为1—num-1

在这里插入图片描述 以下为不完全归纳法归纳:
在这里插入图片描述以下为代码实现:

#include<iostream>
using namespace std;

int main()
{
	int num = 0;
	cin >> num;
	for (int i = 1; i <= num; i++)
	{
		for (int j = 1; j <= num - i; j++)
		{
			cout << " ";
		}
		for (int k = 1; k <= 2 * i - 1; k++)
		{
			cout << "*";
		}
		cout << endl;
	}

	for (int i = 1; i <= num - 1; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			cout << " ";
		}
		for (int k = 1; k <= 2 * (num - i) - 1; k++)
		{
			cout << "*";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

标签:输出,cout,int,打印,C++,num,菱形,实心
来源: https://blog.csdn.net/LyneCate/article/details/112987444