码迷,mamicode.com
首页 > 其他好文 > 详细

距小孩儿高考还有X天---数学篇(1)

时间:2019-12-12 23:39:21      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:read   github   inf   upper   小工具   har   最大   ict   com   


背景

小孩儿上幼儿园中班了,是时候学好语文、数学、英语等等了。小孩的语文主要是学习识字和家长指读。数学主要是学习数字、简单的加减法和其他脑力开发(感觉是骗人的)

 

数学篇

目前已经认识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天---数学篇(1)

标签:read   github   inf   upper   小工具   har   最大   ict   com   

原文地址:https://www.cnblogs.com/mendio/p/12032236.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!