欢迎光临散文网 会员登陆 & 注册

这就是编程中的数学之美嘛?硬核编程,C语言勾勒空心菱形

2020-07-29 13:43 作者:C语言基础  | 我要投稿

前言

今天这篇文章我主要为独特硬核写法之数学艺术,这是属于C语言中基础问题,如果你对C语言基础知识还不熟悉话,可以关注下专栏教程或者自己找本书籍学习一下即可哦。还有就是这篇文章比没有什么实际应用价值,只是单纯的让你重视下数学知识哦!


题目描述

写一个控制台程序,用户输入内层和外层菱形的高度,输出一个空心菱形,菱形的高度定义为菱形的上三角形的高度,如输入5和3,输出如下:


粗鄙的解析

有些人在实现该程序的时候,一开始就是对空心菱形进行分析,最直观的分析策略就是将菱形分成了三段,上三角形,下三角形,中间的空心部分,如下图示意:


按照这种思路,程序示意如下:

#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,此时的程序示意如下:


不知大家看到这段代码是怎样的感觉,有没有被数学美给震撼了。如果大家也有相同的感觉,那你可以好好学习下数学吧,如果你想在编程的这条荆棘路上走的更高高更远,好好数学和物理也是很有必要的哦。

尾言

文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的专栏教程。


这就是编程中的数学之美嘛?硬核编程,C语言勾勒空心菱形的评论 (共 条)

分享到微博请遵守国家法律