正整数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. Thymeleaf中判断Security权限 - SpringBoot

    参考:https://blog.csdn.net/perfect_red/article/details/110821582

  2. 黑马Mybatis快速入门

    创建user表,添加数据,Mysql: 1 create database mybatis; 2 use mybatis; 3 drop table if exists tb_user; 4 crea ...

  3. 【Gerald and Giant Chess】

    一道计数类DP例题~~~ ps:P党似乎不多了-- 我这只蒟蒻第一次写题解,而且计数类DP还是早上刚学的,现学现用,或者说是所谓的"浅谈"一番吧!况且这题写题解的人似乎并不多(大佬 ...

  4. bootstrap怎么让手机端电脑端自适应显示隐藏元素

    我用的是bootstrap v3 这是电脑端: 这是手机端: 其实很简单:我用的 visible-lg 弄了半天才发现md是中等屏幕可见,所以要用lg 代码如下: 一行一共是12,我这里有3个元素,所 ...

  5. 跳板攻击之:SSH 隧道

    跳板攻击之:SSH 隧道 郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共 ...

  6. $(...).bootstrapTable is not a function (已解决)

    1.首先保证Jquery是不是在所有js最前面引入且引入地址正确能打开 2.页面jquery不能重复引入,我这边就是重复引用了导致报错的

  7. LeetCode-1606 找到处理请求最多的服务器

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-servers-that-handled-most-number-of-requests ...

  8. Electron 应用图标修改

    1,首先给窗口添加图标: 1) 窗口图标是图片jpg或者png格式,如果没有图标去[https://www.aigei.com/icon/?wd=icon%E7%BD%91&bd_vid=10 ...

  9. 当越来越多的企业放弃使用FTP,该用什么更好的方式替代?

    FTP作为第一个完整的文件传输协议,在互联网技术发展史上具有浓墨重彩的意义,它解决了文件传输协议有无的问题,在全世界范围内被广泛使用.但如今,随着网络技术的发展,企业生产类型和生产资料的丰富化,文件传 ...

  10. element的upload手动submit前动态设置上传请求地址

    标签地址绑定一个变量 动态修改上传请求地址代码: nextTick是DOM更新后触发,不使用nextTick直接submit,上传地址仍然会使用初始url地址 _this = this; this.u ...