正整数n型方阵(不用数组完成)

一般呢这种n型方阵很多人都是用数组完成,今天呢小编就用简单的循环控制结构来完成,不需用到数组。
题目:
从键盘输入一个正整数n,根据n形成一个方阵。方阵最外层是第一层,每层上用的数字与层数相同。
如输入3,则方阵为:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

题目规律:

(1)n型方阵有2n-1行,2n-1列
(2)在两层循环里i代表行,j代表列;n型方阵以第n行第n列为对称轴,上下左右四个角对称,这是很重要的规律。
(3)代码块分析
(对应代码块看比较清晰)
分为五大模块:
第一模块:第n行时的情况,第n行呢以第n列为中心,左右列上的数字对称,第n行第1到n列的输出,此时第几列上的数字为列数,j此时代表列,在j小于等于n的情况下j++输出了第n行第1~n列的情况;第n行第(n+1)到(2n-1)列的输出,j此时在这里代表列数,但又因为第(n+1) 到(2n-1)列上的数字跟第1到n列对称,所以要通过j的变换来得到第(n+1)到(2n-1)列上的数字,可是又不能影响j在这里代表的内循环,故下面的变量的t就有作用啦。
第二模块:第1到n行的情况,也是以第n列为中心,左右列上的数字对称,也就是说在同一行所对称的列数上的数字相等。
第1到n列的情况j代表列,i代表行,当列数大于行数时,输出i(行数号),也就是说此时i为这一列上对应方阵的数字, 当列数小于行数时,输出j(列数号),也就是说此时j为这一列上对应方阵的数字 。
第三模块:第1到n行第n到(2n-1)列的情况,为了方便确定第n到(2n-1)列上对应的方阵数字,在这里第n到(2n-1)列看成第(n-1)~1列,即从右边来看列数即这个时候在这个情况里从右边开始算起从第一列开始,所以此时j既代表列数又代表这一列所对应的方阵的数字。j代表列,i代表行,当列数大于行数时,输出i(行数号),也就是说此时i为这一列上对应方阵的数字 ;当列数小于行数时,输出j(列数号),也就是说此时j为这一列上对应方阵的数字。
第四模块: 第(n+1)到(2n-1)行第1到n列的情况。
第五个:第(n+1)到(2n-1)行第n~(2n-1)列的情况。

代码块:(对应代码解析)

import java.util.Scanner;
public class fanzheng { public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input= new Scanner(System.in);
System.out.println("请输入一个正整数:");
int n=input.nextInt();//n型方阵有2n-1行,2n-1列
for(int i=1;i<2*n;i++){
//在两层循环里i代表行,j代表列;n型方阵以第n行第n列为对称轴,上下左右四个角对称。这是很重要的规律
if(i==n){//第n行时的情况,第n行呢以第n列为中心,左右列上的数字对称
for(int j=1;j<n+1;j++){
System.out.print(j+"\t");//第n行第1~n列的输出,此时第几列上的数字为列数,j此时代表列,在j小于等于n的情况下j++输出了第n行第1~n列的情况
}
for(int j=n+1;j<2*n;j++){
/*第n行第(n+1)~(2n-1)列的输出,j此时在这里代表列数,但又因为第(n+1)
* ~(2n-1)列上的数字跟第1~n列对称,所以要通过j的变换来得到第(n+1)~
* (2n-1)列上的数字,可是又不能影响j在这里代表的内循环,故下面的变量的t就有作用啦*/
int t=j;//将j的值先赋值给t,通过变量t来保存内循环for这里第几列的列数
int c=j-n;//j减去n代表此时第j列距离第n列的距离
j=n-c;
/*n减去c此时得到以第n列为对称轴右边第(n+1)~(2n-1)列对应到左边的那一列
* ,又因为对称的两列上的数字会相等并且第n行第1~n列上的数字刚好为第几列列数,
* 所以此时这里的j代表的是第n行右边也就是列数范围为(n+1)~(2n-1)的第t
* 列(也就是原来的第j列)上的数字*/
System.out.print(j+"\t");/*此时这里的j代表的是第n行右边也就是列数
范围为(n+1)~(2n-1)的第t列(也就是原来的第j列)上的数字,赶紧输出来*/
j=t;//将代表列数的t赋回给j;不影响内层循环for
}
System.out.println();//换行,因为此时第n行都全部输出了,就要及时换行
}
if(i<n){//第1~n行的情况,也是以第n列为中心,左右列上的数字对称,也就是说在同一行所对称的列数上的数字相等,
for(int j=1;j<n+1;j++){//第1~n列的情况
if(j>=i){
System.out.print(i+"\t");//j代表列,i代表行,当列数大于行数时,输出i(行数号),也就是说此时i为这一列上对应方阵的数字
}
else {
System.out.print(j+"\t");//j代表列,i代表行,当列数小于行数时,输出j(列数号),也就是说此时j为这一列上对应方阵的数字
}
} for(int j=n+1;j<2*n;j++){//第n~(2n-1)列的情况,下面的t,j,c的用法跟第n行第n~(2n-1)列的用法意思差不多一样
int t=j;
int c=j-n;
j=n-c;/*为了方便确定第n~(2n-1)列上对应的方阵数字,在这里第n~(2n-1)
列看成第(n-1)~1列,即从右边来看列数即这个时候在这个情况里从右边开始算起从第一列开始,所以此时j既代表列数又代表这一列所对应
的方阵的数字*/
if(j>=i){
System.out.print(i+"\t");//j代表列,i代表行,当列数大于行数时,输出i(行数号),也就是说此时i为这一列上对应方阵的数字
}
else{
System.out.print(j+"\t");//j代表列,i代表行,当列数小于行数时,输出j(列数号),也就是说此时j为这一列上对应方阵的数字
}
j=t;
}
System.out.println();
}
if(i>n){//第(n+1)~(2n-1)行的情况
for(int j=1;j<n+1;j++){//第1~n列的情况,下面的解释跟上面的一样结合第一第二个if的解释,因为以第n行第n列为对称轴上下左右对称
int f=i;
int c=f-n;
f=n-c;
if(j<=f){
System.out.print(j+"\t");
}
else{
System.out.print(f+"\t");
} }
for(int j=n+1;j<2*n;j++){//第n~(2n-1)列的情况,下面的解释跟上面的一样结合第一第二个if的解释,因为以第n行第n列为对称轴上下左右对称
int f=i;
int c=f-n;
f=n-c;
int t=j;
int g=j-n;
j=n-g;
if(j<=f){
System.out.print(j+"\t");
}
else{
System.out.print(f+"\t");
}
j=t;
}
System.out.println();
}
input.close();
}
}
}

输入正整数3运行结果:

正整数n型方阵的更多相关文章

  1. 2017.12.10《“剑锋OI”普及组多校联盟系列赛(14)#Sooke#Kornal 的课余时间 》分析报告

    报告内容如下 - - [导语] ------ 太晚了,时间也紧,一切尽量从简吧 PS:本文题目来自剑锋OI 所以废话也不多说,进入正题吧,代码直接跟在题目后边儿,主要分析在代码前,次要的就写在代码后面 ...

  2. C#学习笔记(二十):C#总结和月考讲解

    m1w1d2_console_variable_constant 输入Console.WriteLine(); 输出Console.ReadLine(); 快捷键 折叠代码:快捷键“Ctrl+ K + ...

  3. C#学习笔记(五):while循环和for循环

    while循环 while循环和for循环,可以相互替换,范围和效能一样,理解事物的逻辑不一样 while循环用于条件不确定的逻辑 for循环用于计算次数的逻辑 for循环 快捷写法,按两下TAB i ...

  4. 求int型正整数在内存中存储时1的个数

    题目描述: 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入例子: 5 输出例子: ...

  5. 华为oj之求int型正整数在内存中存储时1的个数

    题目: 求int型正整数在内存中存储时1的个数 热度指数:4427 时间限制:1秒 空间限制:32768K 题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: ...

  6. 牛客网编程练习(华为机试在线训练)-----求int型正整数在内存中存储时1的个数

    题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 示例1 输入 5 输出 2 P ...

  7. java笔试之求int型正整数在内存中存储时1的个数

    输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 关键点:n与二进制的1相与:判断最末位是否为1:向右移位. 类似题目是查找输入整数二进制中1的个数. package test; ...

  8. 求int型正整数在内存中存储时1的个数 && int型的数到底最大是多少?

    输入一个int型的正整数(十位数之内!嘞!),计算出该int型数据在内存中存储时1的个数. #include<bits/stdc++.h> using namespace std; int ...

  9. 【华为机试】—— 15.求int型正整数在内存中存储时1的个数

    题目 解法 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner ...

  10. 输入一个正整数n (1<n<=10),生成 1个 n*n 方阵 求出对角线之和

    #define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <stdio.h> #include <std ...

随机推荐

  1. 【一句话】CAP原则

    首先一句话: 如果出现网络分区(P),持有旧数据的节点是否要继续提供服务,提供就保证了可用(A),但数据不一定新,放弃了C:如果不提供服务,则意味着放弃了可用性A,但是保证数据一致(C). 我的理解: ...

  2. http八股 跨域的本质 请求行 请求头 请求体 xss

    1小八股 介绍 http 请求分为三个部分,请求行,请求头,请求体 还有状态码的含义 https://juejin.cn/post/7096317903200321544 2tips Content- ...

  3. mingw + cmake + vscode

    .vscode settings.json {     "cmake.generator": "MinGW Makefiles" } cmake-kits.js ...

  4. 2021级《JAVA语言程序设计》上机考试试题7

    现在是学生查看,重置密码,原来是搜索,现在直接浏览,直接重置密码,改了下 代码如下: <%@ page language="java" contentType="t ...

  5. python爬虫学习——文件操作,异常处理

    文件操作 ''' f = open("a.txt","w") #打开一个文件, w模式(写),如果文件不存在就在当前目录下创建 f.write("he ...

  6. noip2020模拟赛 背包 (knapsack)

    题目 区间 \(01\) 背包 \(1 \le l_i \le r_i \le n \le 20000,1 \le q \le 100000,1 \le m_i \le 500, 1 \le w_i ...

  7. vue 获取select选中的当前option所在对象的各种值

  8. js的map、filter的用法

    filter() 创建新数组,新数组放指定数组中符合条件的元素,满足条件的留下,是对原数组的过滤. map()    返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值,是对原数组的加工,映 ...

  9. Linux:atime、mtime、ctime

    三个时间 Linux 的文件属性中有:访问时间(Access Time).修改时间(Modify Time).改变时间(Change Time): 访问时间(Access Time):对文件进行一次读 ...

  10. ImGui窗口标题栏的高度

    FontSize + FramePadding.y * 2 具体参考How to customize titlebar elements? · Issue #1539 · ocornut/imgui ...