C語言硬核編程之勾勒空心菱形

前言

今天這篇文章我主要爲獨特硬核寫法之數學藝術,這是屬於C語言中基礎問題,若是你對C語言基礎知識還不熟悉話,能夠關注下專欄教程或者本身找本書籍學習一下便可哦。還有就是這篇文章沒有什麼實際應用價值,只是單純的讓你重視下數學知識哦!編程

問題描述

寫一個控制檯程序,用戶輸入內層和外層菱形的高度,輸出一個空心菱形,菱形的高度定義爲菱形的上三角形的高度,如輸入5和3,輸出以下:windows

粗鄙解法
有些人在實現該程序的時候,一開始就是對空心菱形進行分析,最直觀的分析策略就是將菱形分紅了三段,上三角形,下三角形,中間的空心部分,以下圖示意:

按照這種思路,程序示意以下:
#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;}
粗暴數學解法
在上述解法中咱們老是在努力的拼湊各類m和n的表達式,與其這樣苦苦尋找,爲什麼不直接將這個空心菱形放入座標軸中呢。 在電腦屏幕上,人們習慣將靠右稱之爲x軸,靠下稱之爲y軸,將空心菱形畫在屏幕上,示意以下: 而後經過解析幾何知識勾勒空心菱形,程序示意以下:

看完後是否感受比第一種的實現優雅了不少呢。微信

優雅數學解法
粗暴的數學解析好像仍是挺複雜的,有沒有更好的辦法呢,估計不少朋友在看到我上面的解析代碼已經想到了,那就是將座標軸移到菱形的中間去,示意以下:
(+x) + (+y) < m(-x) + (+y) < m(+x) + (-y) < m(-x) + (-y) < m

合併後的表達式爲:abs(x)+abs(y)<m,此時的程序示意以下:app

不知你們看到這段代碼是怎樣的感受,有沒有被數學美給震撼了。若是你們也有相同的感受,那你能夠好好學習下數學吧,若是你想在編程的這條荊棘路上走的更高高更遠,好好數學和物理也是頗有必要的哦。學習

結束語
文章都是手打原創,天天最淺顯的介紹C語言、C++,windows知識,喜歡個人文章就關注一波吧,天天帶你學習C/C++不一樣的知識,也能夠看到最新更新和以前發表的文章哦。


本文分享自微信公衆號 - C語言編程基礎(goodStudyCode)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。flex

相關文章
相關標籤/搜索