数字数码管-解题思路及过程

一.题目描述:


数字或字母可以用7位数码管显示(就是排列为8字形的7个数码管)

       @@@@    ...       0
     @           @  ...    1   2
     @           @         

       @@@@    ...       3
     @           @  ...    4    5    
     @           @
       @@@@    ...       6


对于大型灯管,为了节约使用,在切换数字的时候,如果该灯管的状态没有改变,则不需要对该灯管关了再开。

已知一个数字变化的系列,求7个数码管开关的动作。
(1) 0,2,3,5,6
(2) 0,1,4,6,5,3


二.解题思路:

首先我们会想这9个数字在数码管上是如何显示的,然后会想要这9个数字之间是如何过渡的,可能是两个相邻数字之间的变化,也可能是不同数字之间的变化,如何才能够解决这个过渡的问题就是我们应该好好思考的。


我们知道将数码管开启的时候是所有的灯都先亮一下(即亮出8这个数字),然后才会变化到我们想要的数字的。而如何进行变化呢?我们就会想到如果想从一个数字变换到另一个数字,先要做的就是将该灭的灯先灭掉(即将对应显示的数字所不需要亮的灯给灭了,比如数字3,我们需要灭的登就是上图所对应的1号和4号位置),如果该灯本来就是灭的我们就不做任何操作,如果该灯是亮的则灭了他;然后要做的就是亮起我们需要亮的灯,道理同上面一样。


三.Java代码如下:

public class Test06 {
	public static void main(String[] args) {
		// String value = "02356";    	//需要变换的数码管的数字序列
		String value = "0146538";
		int[][] light = init();			//初始化各数字所对应的需要灭的灯
		String[] result = new String[value.length()];	//存放每个是自所对应的亮灭灯情况
		int[] tmp = new int[7];			//存放每个数字所对应的亮灭灯状态:0为灯亮、1则为灯灭
		int[] tmp2 = new int[7];		//存放每个数字灭了的灯号
		int n;							//计数tmp2中存入的个数

		// 假设初始时全亮
		for (int i = 0; i < value.length(); i++) {
			int t = value.charAt(i) - '0';				//取得一个数字
			result[i] = "";								//初始化该数字对应变换的结果值
			n = 0;
			for (int j = 0; j < light[t].length; j++) {	//该数字所对应的需要灭的灯的数量,循环灭了
				int m = tmp[light[t][j]];				//该等对应的亮灯状态,为0则灭了,否则不变,但是都需要将其灯号将如tmp2记录
				if (m == 0) {
					result[i] += "灭" + light[t][j];
					tmp[light[t][j]] = 1;

				}
				tmp2[n++] = light[t][j];
			}
			for (int k = 0; k < tmp.length; k++) {		//循环亮起该数字需要亮的等,即状态为1的则亮起,但是前面刚灭的不需要亮
				if (tmp[k] == 1) {
					int l;
					for (l = 0; l < n; l++) {
						if (tmp2[l] == k) {
							break;
						}
					}
					if (l == n) {
						result[i] += "亮" + k;
						tmp[k] = 0;
					}
				}
			}
		}

		for (int i = 0; i < result.length; i++) {	//循环输出每个数字所对应的灯管变化的情况
			if (result[i].equals(""))
				System.out.println("不变");
			else
				System.out.println(result[i]);
		}

	}

	static int[][] init() {		//初始化每个数字所对应需要灭的灯放入一个二维数组中
		int[][] light = new int[10][];

		light[0] = new int[1];
		light[0][0] = 3;

		light[1] = new int[5];
		light[1][0] = 0;
		light[1][1] = 1;
		light[1][2] = 3;
		light[1][3] = 4;
		light[1][4] = 6;

		light[2] = new int[2];
		light[2][0] = 1;
		light[2][1] = 5;

		light[3] = new int[2];
		light[3][0] = 1;
		light[3][1] = 4;

		light[4] = new int[3];
		light[4][0] = 0;
		light[4][1] = 4;
		light[4][2] = 6;

		light[5] = new int[2];
		light[5][0] = 2;
		light[5][1] = 4;

		light[6] = new int[1];
		light[6][0] = 2;

		light[7] = new int[4];
		light[7][0] = 1;
		light[7][1] = 3;
		light[7][2] = 4;
		light[7][3] = 6;

		light[8] = new int[0];

		light[9] = new int[2];
		light[9][0] = 4;
		light[9][1] = 6;

		return light;
	}
}

结果如下:


至此,该题目就结束了,以上为个人思路,仅供参考,有什么不到位的地方欢迎批评指正,谢谢......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值