距小孩儿高考还有X天---数学篇
Posted mendio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了距小孩儿高考还有X天---数学篇相关的知识,希望对你有一定的参考价值。
背景
小孩儿上幼儿园中班了,是时候学好语文、数学、英语等等了。小孩的语文主要是学习识字和家长指读。数学主要是学习数字、简单的加减法和其他脑力开发(感觉是骗人的)
数学篇
目前已经认识100以内的所有数字,所以目前主要以简单的加减法为主,但是每天手动出题太麻烦了,耗时又比较费脑细胞(主要是费头发),所以就开发了一个小工具,见图:
图中有三个区域,分别是加法,减法,数独(貌似不怎么正宗),寡人的任务就是每天给打印一两张出来做让小孩儿练习联系(当然之前已经教了解题的方法,至于是什么方法本文不再介绍或另开一篇文章介绍)。
这些练习题都是随机生成,每次刷新均不一样,所以说很方便的。
加法
加法是写了一个简单的算法,具体接收的参数有如下:
MaxValue:加法和最大的值,就是通常所说的XX数以内的加法,这个XX就是这里的MaxValue,如果不提供就是10(我觉得这是简单加减法的起码数字);
MinValue:加法和最小的值,比如我们通常说的10至20以内的加法,这MinValue就是10,如果不提供就是2;
AddendCount:多少个加数,默认是2,。因为想一劳永逸,所以增加了该参数,方便以后可能出现3个、4个乃至于N个加数的情况;
ItemUpperLimit:加数不能超过的值;
具体算法是采用递归的方式,计算出MinValue到MaxValue之间所有数的AddendCount个加数
private class AdditionAlgorithm { /// <summary> /// 假设给定的数字是4,分解成2个数字,则[ [1,3],[2,2]] /// </summary> /// <param name="number">待分解的数</param> /// <param name="times">分解成几个数字</param> public static List<List<int>> Resolve(int number, int times) { var baseNumber = number; var maxValue = number + 1 - times; var container = new AdditionItemContainer(); for (var i = 1; i <= maxValue; i++) { var addends = new List<int> { i }; ResolveCore(container, addends, baseNumber, number - i, times); } return container.Items; } /// <summary> /// /// </summary> /// <param name="container"></param> /// <param name="addends"></param> /// <param name="baseNumber"></param> /// <param name="number"></param> /// <param name="times"></param> private static void ResolveCore(AdditionItemContainer container, List<int> addends, int baseNumber, int number, int times) { if (addends.Count == times - 1) { if (addends.Sum() < baseNumber) { addends.Add(baseNumber - addends.Sum()); container.Add(addends); } return; } for (var i = 1; i < number; i++) { var dd = new List<int>(addends) { i }; ResolveCore(container, dd, baseNumber, number - 1, times); } } private class AdditionItemContainer { private readonly IDictionary<int, List<int>> _dictionary = new Dictionary<int, List<int>>(); public List<List<int>> Items => _dictionary.Values.ToList(); public void Add(List<int> value) { if (value == null || value.Count == 0) { return; } value.Sort(); //使用一个hashcode 主要是防止重复,比如1+2和2+1是一样的,所以便不重复加入
//考虑到将来可能学习结合律等,应该是都会要的
var hashCode = string.Join(",", value).GetHashCode(); if (!_dictionary.ContainsKey(hashCode)) { _dictionary.Add(hashCode, value); } } } }
其实目前来说该方式不是很好或者说高效,以后有时间再优化一下
减法
减法和加法的计算方式差不多
数独
其实严格来说不算很正宗的数独,但是也要求每一行每一列的数字不能相同,比如:
(来自小孩子的灵魂字体)
这种就比较简单了(九宫格那种肯定比较复杂,这里不说了),首先就是初始化一个数组即:int[N][N],然后在随机初始化N个数字,初始化的数字也必须满足横列的要求。
具体的实现比较简单,可以直接看代码即可,因为是自用所以代码方面没有什么讲究。
相关的源代码见:https://github.com/rosenix/MathGen
以上是关于距小孩儿高考还有X天---数学篇的主要内容,如果未能解决你的问题,请参考以下文章