数学逻辑打印关于for循环打印特殊图形《Blind-Stab》

2023-10-18 18:20

本文主要是介绍数学逻辑打印关于for循环打印特殊图形《Blind-Stab》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在回顾基础内容,发现关于for循环打印图形这一块其实有点东西,并且可以的到一个经验与一个总结!

如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。

分析:其实像这种for循环打印特殊图形的问题其实大部分都是数学问题,需要编者自己去找规律;

 因为该图形不是单纯的递增或递减,所以可以用四个for循环,两两分开,分别打印上部分和下部分,如下:

public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入N:");int N = scanner.nextInt();for (int i = 1; i <= N; i++) {for (int j  = 1; j <= i; j++) {System.out.print("*");}System.out.println("");}for (int i = N - 1; i >= 1; i--) {for (int j = i; j >= 1; j--) {System.out.print("*");}System.out.println("");}}
}

但是很明显,用四个for循环太low了,而且时间复杂度空间复杂度有浪费。那我们就改: 

public class Home001 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入行数:");int N = scanner.nextInt();for (int i = 1; i < 2*N;i++) {//			for (int j = 1; j <= i && j <= 2*N - i; j++) {
//				System.out.print("*");
//			}for (int j = 1; j <= N - Math.abs(N-i); j++) {//在这里,N-Math.abs(N-i)的最大值就是NSystem.out.print("*");	//不会因为上面2*N的改变而改变。}System.out.println("");}}
}

 针对上面代码的第二层循环注释与非注释部分,非常巧妙。N - Math.abs(N-i) 其实就等于 j <= i && j <= 2*N - i;   因为把绝对值去掉就会变成又边的式子。

如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。

代码如下:

同理:

public class Home002 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入行数:");int N = scanner.nextInt();for (int i = 1; i < 2*N; i++) {
//			for (int k = 1; k <= Math.abs(N-i) ; k++) {
//				System.out.print(" ");
//			}
//			for (int j = 1; j <= N - Math.abs(N-i); j++) {
//				System.out.print("*");
//			}
//			System.out.println("");for (int k = 1; k <= N - i || k <= i - N; k++) {System.out.print(" ");}for (int j = 1; j <= i && j <= 2*N - i; j++) {System.out.print("*");}System.out.println("");}}
}

如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。

代码如下:

public class Home003 {public static void main(String[] args) {Scanner scanner  = new Scanner(System.in);System.out.print("请输入行数:");int N = scanner.nextInt();for (int i = 1; i < 2*N ; i++) {for (int j = 1; j <= N - i || j <= i - N; j++) {System.out.print(" ");}System.out.print("*");for (int k = 1; k <= 2*N-3 - Math.abs(2*N - 2*i); k++) {System.out.print(" ");}if(i>1&&i<2*N-1) {System.out.print("*");}System.out.println("");}}
}

如题:键盘录入一个N,当N = 5时,打印的图形如下,请给出常规代码。

分析:其实这个就只是第二个的变体,直接在  *  旁边空出一个空格就行,代码如下:

public class Home002 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入行数:");int N = scanner.nextInt();for (int i = 1; i < 2*N; i++) {
//			for (int k = 1; k <= Math.abs(N-i) ; k++) {
//				System.out.print(" ");
//			}
//			for (int j = 1; j <= N - Math.abs(N-i); j++) {
//				System.out.print("*");
//			}
//			System.out.println("");for (int k = 1; k <= N - i || k <= i - N; k++) {System.out.print(" ");}for (int j = 1; j <= i && j <= 2*N - i; j++) {System.out.print("* ");}System.out.println("");}}
}

总结:其实用※形打印各种对称的图形的关键是数学问题,常说的找规律,并且边缘与内部同时考虑,把边缘部分当成一条线,设法模拟求出该线的方程,在进一步进行求解。同时关于对称很多时候用到绝对值,关键是要找到其特殊点和位置。

这篇关于数学逻辑打印关于for循环打印特殊图形《Blind-Stab》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234348

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。