這就是編程中的數(shù)學(xué)之美嘛?硬核編程,C語(yǔ)言勾勒空心菱形
前言
今天這篇文章我主要為獨(dú)特硬核寫(xiě)法之?dāng)?shù)學(xué)藝術(shù),這是屬于C語(yǔ)言中基礎(chǔ)問(wèn)題,如果你對(duì)C語(yǔ)言基礎(chǔ)知識(shí)還不熟悉話,可以關(guān)注下專(zhuān)欄教程或者自己找本書(shū)籍學(xué)習(xí)一下即可哦。還有就是這篇文章比沒(méi)有什么實(shí)際應(yīng)用價(jià)值,只是單純的讓你重視下數(shù)學(xué)知識(shí)哦!

題目描述
寫(xiě)一個(gè)控制臺(tái)程序,用戶(hù)輸入內(nèi)層和外層菱形的高度,輸出一個(gè)空心菱形,菱形的高度定義為菱形的上三角形的高度,如輸入5和3,輸出如下:

粗鄙的解析
有些人在實(shí)現(xiàn)該程序的時(shí)候,一開(kāi)始就是對(duì)空心菱形進(jìn)行分析,最直觀的分析策略就是將菱形分成了三段,上三角形,下三角形,中間的空心部分,如下圖示意:

按照這種思路,程序示意如下:
include <stdio.h>
int main(){
? ?int star = 0, empty = 0;
? ?int num_empty = 0, num_star=0;
? ?int m = 5, n = 3;
? ?for (int i = 1; i < 2 * m; i++)
? ?{
? ? ? ?if (i <= m - n) {
? ? ? ? ? ?star = 2 * i - 1;
? ? ? ? ? ?empty = m - i;
? ? ? ? ? ?while (empty--)
? ? ? ? ? ? ? ?printf(" ");
? ? ? ? ? ?while (star--)
? ? ? ? ? ? ? ?printf("*");
? ? ? ?}
? ? ? ?else if (m - n < i && i < m + n && j < 2 * n) {
? ? ? ? ? ?if (j <= n && i <= m) {
? ? ? ? ? ? ? ?num_empty = 2 * j - 1;
? ? ? ? ? ? ? ?empty = m - i;
? ? ? ? ? ?}
? ? ? ? ? ?else {
? ? ? ? ? ? ? ?num_empty = 2 * (2 * n - 1 - (j - 1)) - 1;
? ? ? ? ? ? ? ?empty = i - m;
? ? ? ? ? ?}
? ? ? ? ? ?num_star = star = m - n;
? ? ? ? ? ?while (empty--)
? ? ? ? ? ? ? ?printf(" ");
? ? ? ? ? ?while (star--)
? ? ? ? ? ? ? ?printf("*");
? ? ? ? ? ?while (num_empty--)
? ? ? ? ? ? ? ?printf(" ");
? ? ? ? ? ?while (num_star--)
? ? ? ? ? ? ? ?printf("*");
? ? ? ? ? ?j++;
? ? ? ?}
? ? ? ?else {
? ? ? ? ? ?star = 2 * (2 * m - 1 - (i - 1)) - 1;
? ? ? ? ? ?empty = (2 * m - 1 - star) / 2;
? ? ? ? ? ?while (empty--)
? ? ? ? ? ? ? ?printf(" ");
? ? ? ? ? ?while (star--)
? ? ? ? ? ? ? ?printf("*");
? ? ? ?}
? ? ? ?printf("\n");
? ?}
? ?return 0;
}
粗暴的數(shù)學(xué)解析
在上述解法中我們總是在努力的拼湊各種m和n的表達(dá)式,與其這樣苦苦尋找,為何不直接將這個(gè)空心菱形放入坐標(biāo)軸中呢。在電腦屏幕上,人們習(xí)慣將靠右稱(chēng)之為x軸,靠下稱(chēng)之為y軸,將空心菱形畫(huà)在屏幕上,示意如下:然后通過(guò)解析幾何知識(shí)勾勒空心菱形,程序示意如下:

看完后是否感覺(jué)比第一種的實(shí)現(xiàn)優(yōu)雅了很多呢。
優(yōu)雅的數(shù)學(xué)解析
粗暴的數(shù)學(xué)解析好像還是挺復(fù)雜的,有沒(méi)有更好的辦法呢,估計(jì)很多朋友在看到我上面的解析代碼已經(jīng)想到了,那就是將坐標(biāo)軸移到菱形的中間去,示意如下:
(+x) + (+y) < m
(-x) + (+y) < m
(+x) + (-y) < m
(-x) + (-y) < m
合并后的表達(dá)式為:abs(x)+abs(y)<m,此時(shí)的程序示意如下:

不知大家看到這段代碼是怎樣的感覺(jué),有沒(méi)有被數(shù)學(xué)美給震撼了。如果大家也有相同的感覺(jué),那你可以好好學(xué)習(xí)下數(shù)學(xué)吧,如果你想在編程的這條荊棘路上走的更高高更遠(yuǎn),好好數(shù)學(xué)和物理也是很有必要的哦。
尾言
文章都是手打原創(chuàng),每天最淺顯的介紹C語(yǔ)言、C++,windows知識(shí),喜歡我的文章就關(guān)注一波吧,每天帶你學(xué)習(xí)C/C++不同的知識(shí),也可以看到最新更新和之前發(fā)表的文章哦。如果足下基礎(chǔ)比較差,不妨關(guān)注下人人都可以學(xué)習(xí)的專(zhuān)欄教程。