吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2039|回复: 63
收起左侧

[其他原创] 一二年级100以内两位加减法【学霸版】

  [复制链接]
156608225 发表于 2024-8-8 18:59
本帖最后由 156608225 于 2024-8-8 19:04 编辑

上次发了《小学一年级100以内加减法生成(两位数加减一位数或整十数)》
https://www.52pojie.cn/thread-1932954-1-1.html
有善良的家长提出需要两位数加减的,用以提高孩子的曲率从而达到超光速的效果,共勉!
现推出【100以内两位加减法·小达人版】,帮助家长们度过一个愉快的假期。

* 每次打开随机100道题(鼠标点击单个算式可单独刷新该题)
* 同样100道题刚好一张A4纸打印
* 打印多张可以用记事本修改源码里的 let page_num = 1; // 页数
QQ截图20240808190330.png
[HTML] 纯文本查看 复制代码
<html>
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>100以内两位加减法</title>
        <style>
                body {
                        width: 210mm; /* A4纸宽度减去边距 */
                        /*height: 297mm;  A4纸高度减去边距 */
                        /*margin: 5mm auto;  上下左右边距 */
                        font-family: Arial, sans-serif;
                        font-size: 24px;
                        text-align: center;
                        padding: 0;
                }
                .paper {
                        display: grid;
                        grid-template-columns: repeat(4, 1fr); /* 4列 */
                        grid-gap: 5mm 5mm;  /*设置行间距和列间距 */
                }
                .question {
                        text-align: left;
                }
                
                .page-break { display: none; }
                [url=home.php?mod=space&uid=945662]@media[/url] print {
                        .page-break {
                                display: block;
                                page-break-before: always;
                        }
                }
        </style>
</head>
<body>
        <!--p>班级________  姓名________  时间________</p-->
        <div id="Papers"></div>
        <script>
                //辅助函数:计算[min,max)随机数
                function getRandMinMax(min,max) {  
                        return Math.floor(Math.random() * (max-min) + min);
                }
                //辅助函数:随机获取一个数组元素
                function getRandInArray(array) {
                        let pos = getRandMinMax(0, array.length)
                        return array[pos];
                }
                
                //二元算式(加法)
                class MathExprAdd {
                        constructor(x, y) { this.op='+'; this.x = x; this.y = y; }
                        result(){ return this.x + this.y; }
                        toStr() { return `${this.x} + ${this.y}`; }
                }
                //二元算式(减法)
                class MathExprSub {
                        constructor(x, y) { this.op='-'; this.x = x; this.y = y; }
                        result(){ return this.x - this.y; }
                        toStr() { return `${this.x} - ${this.y}`; }
                }
                
                // 以结果为key的Map题库(用于替换二元算式为三元算式)
                class MathExprMap {
                        constructor() { this.map = new Map(); }
                        push(expr) {
                                if (this.map.has(expr.result())){
                                        let array = this.map.get(expr.result());
                                        array.push(expr);
                                } else {
                                        let array = [];
                                        array.push(expr);
                                        this.map.set(expr.result(), array);
                                }
                        }
                        rand(ret){
                                if (this.map.has(ret)){
                                        return getRandInArray(this.map.get(ret));
                                }
                                return null;
                        }
                }
                
                var arrayAdd = [];                // 普通加法题库
                var arrayAddCarry = [];        // 进位加法题库
                var arrayAddTen = [];        // 包含整十数加法题库
                var arraySub = [];                // 普通减法题库
                var arraySubBorrow = [];// 退位减法题库
                var arraySubTen = [];        // 包含整十数减法题库
                
                var mapRet = new MathExprMap();// 以结果为key的题库(不含整十数加减法)
                var mapGen = new Map();        // 记录生成的算式,防止重复
                
                // 生成题库:两位数加两位数(包含进位加) (a*10+b)+(c*10+d)
                for (let a = 1; a < 10; a++) {
                        for (let b = 0; b < 10; b++) {
                                for (let c = 1; c < 10; c++) {
                                        for (let d = 0; d < 10; d++) {
                                                if (b == 0 && d == 0) continue;//过滤整十相加
                                                let ret = (a*10+b)+(c*10+d);
                                                if (ret < 100){//结果小于100
                                                        let expr = new MathExprAdd(a*10+b, c*10+d);
                                                        if (b == 0 || d == 0) {//含整十数
                                                                arrayAddTen.push(expr);
                                                                //三元运算替换时不使用整十数加法
                                                                //mapRet.push(expt);
                                                        } else if (b + d >= 10) {//进位加
                                                                arrayAddCarry.push(expr);
                                                                mapRet.push(expr);
                                                        } else {
                                                                arrayAdd.push(expr);
                                                                mapRet.push(expr);
                                                        }
                                                }
                                        }
                                }
                        }
                }
                // 生成题库:两位数减两位数(包含退位减) (a*10+b)-(c*10+d)
                for (let a = 1; a < 10; a++) {
                        for (let b = 0; b < 10; b++) {
                                for (let c = 1; c < 10; c++) {
                                        for (let d = 0; d < 10; d++) {
                                                if (b == 0 && d == 0) continue;//过滤整十相减
                                                if (b == d) continue;//过滤个位相等(太简单)
                                                let ret = (a*10+b)-(c*10+d);
                                                if (ret > 0) {
                                                        let expr = new MathExprSub(a*10+b, c*10+d);
                                                        if (d == 0) {//这里只包含减整十数,整十数减放在退位减
                                                                arraySubTen.push(expr);
                                                                //三元运算替换时不使用整十数加法
                                                                //mapRet.push(expt);
                                                        } else if (b < d){//退位减
                                                                arraySubBorrow.push(expr);
                                                                mapRet.push(expr);
                                                        } else {
                                                                arraySub.push(expr);
                                                                mapRet.push(expr);
                                                        }
                                                }
                                        }
                                }
                        }
                }
                
                const RATE_NORMAL = 0.05        // 普通比率
                const RATE_TEN = 0.05                // 含整十数比率
                //const RATE_DIGITAL = 0.90        // 进位加和退位减比率
                
                const RATE_THREE = 0.20                // 转化三元算式比率
                
                // 随机生成1个算式
                function generateQuestion() {
                        let expr;
                        //50%加法 50%减法
                        if (Math.random() < 0.5) {
                                let rate = Math.random()
                                if (rate < RATE_NORMAL) {
                                        expr = getRandInArray(arrayAdd);
                                } else if (rate < RATE_NORMAL+RATE_TEN) {
                                        expr = getRandInArray(arrayAddTen); //整十数
                                } else {
                                        expr = getRandInArray(arrayAddCarry); //进位加
                                }
                        } else {
                                let rate = Math.random()
                                if (rate < RATE_NORMAL) {
                                        expr = getRandInArray(arraySub);
                                } else if (rate < RATE_NORMAL+RATE_TEN) {
                                        expr = getRandInArray(arraySubTen); //整十数
                                } else {
                                        expr = getRandInArray(arraySubBorrow); //退位减
                                }
                        }
                        
                        // 20%出现三元运算
                        if (Math.random() < RATE_THREE) {
                                if (Math.random() < 0.2) {//20%对第二个数转换算式(后括号)
                                        let expr2 = mapRet.rand(expr.y);
                                        if(expr2!=null) {
                                                if (expr.op == '+' && Math.random() < 0.5) { //加法有50%几率交换加数位置
                                                        if (Math.random() < 0.5) {//50%几率去掉前括号
                                                                return `${expr2.toStr()} + ${expr.x} =`;
                                                        } else {
                                                                return `(${expr2.toStr()}) + ${expr.x} =`;
                                                        }
                                                }
                                                return `${expr.x} ${expr.op} (${expr2.toStr()}) =`;
                                        }
                                } else { //80%对第一个数转换算式(前括号)
                                        let expr2 = mapRet.rand(expr.x);
                                        if (expr2!=null) {
                                                if (expr.op == '+' && Math.random() < 0.5) { //加法有50%几率交换加数位置
                                                        return `${expr.y} + (${expr2.toStr()})  =`;
                                                }
                                                if (Math.random() < 0.5) {//50%几率去掉前括号
                                                        return `${expr2.toStr()} ${expr.op} ${expr.y} =`;
                                                } else {
                                                        return `(${expr2.toStr()}) ${expr.op} ${expr.y} =`;
                                                }
                                        }
                                }
                        }
                        return expr.toStr() + ' =';
                }
                
                // 随机生成1个不重复算式
                function generateUniqueQuestion() {
                        var expr = generateQuestion();
                        while(mapGen.has(expr))
                                expr = generateQuestion();
                        mapGen.set(expr, 1);
                        return expr;
                }
                
                // 按页生成算式,每页100题
                function generateMathExpression() {
                        const Papers = document.getElementById('Papers');
                        while (Papers.firstChild) {
                                Papers.removeChild(Papers.firstChild);
                        }
                        let page_num = 1; // 页数
                        for (let p = 0; p < page_num; p++) {
                                const paper = document.createElement('div');
                                paper.className = 'paper';
                                Papers.appendChild(paper);
                                for (let i = 0; i < 100; i++) {
                                        const question = document.createElement('div');
                                        question.className = 'question';
                                        question.textContent = generateUniqueQuestion();
                                        question.addEventListener('click', function() {
                                                this.textContent = generateUniqueQuestion();
                                        });
                                        paper.appendChild(question);
                                }
                                // 非尾页插入分页符
                                if (p < page_num - 1) {
                                        const page_break = document.createElement('div');
                                        page_break.className = 'page-break';
                                        Papers.appendChild(page_break);
                                }
                        }
                }
                generateMathExpression();
                /*
                console.log(arrayAdd.length);
                console.log(arrayAddCarry.length);
                console.log(arrayAddTen.length);
                console.log(arraySub.length);
                console.log(arraySubBorrow.length);
                console.log(arraySubTen.length);
                for (let [key, value] of mapRet.map) {
                        console.log(key, value.length);
                        for (let i = 0; i < value.length; i++) {
                          console.log('\t',value[i].toStr());
                        }
                }
                console.log('end');*/
        </script>
</body>
</html>



100以内加减法(两位数加减).zip

2.78 KB, 下载次数: 139, 下载积分: 吾爱币 -1 CB

100以内两位加减法·小达人版

免费评分

参与人数 8吾爱币 +13 热心值 +8 收起 理由
giood525 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
sadly2004 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
rockboy82 + 1 + 1 谢谢@Thanks!
Lingjohnny + 1 热心回复!
wuai3456 + 1 + 1 谢谢@Thanks!
FitContent + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lccccccc + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

dph5199278 发表于 2024-8-8 20:33
谢谢分享,做一下组合,就能出个位数加减法给幼儿园的小朋友了;在每个算式那边,做个表格,存起来,分两张,一张答案,一张试题,这样就方便幼儿园小朋友自己对照答案了
windyhef 发表于 2024-8-9 08:53

搜索一下:一二年级口算题出题系统,就可以找到,软件界面如图。但是我觉得楼主给出的代码才是更棒的,值得我们推荐。

无标题.png
zy1401 发表于 2024-8-8 19:09
xxkz 发表于 2024-8-8 19:10
然后问题来了,答案能显示出来吗?
 楼主| 156608225 发表于 2024-8-8 19:13
xxkz 发表于 2024-8-8 19:10
然后问题来了,答案能显示出来吗?

要答案作甚,你还一个个去改啊,现在都是手机扫一下就改好了,夸克浏览器啥的好多都有这个
13729181580 发表于 2024-8-8 19:19
感谢分享!
Liebesfreud 发表于 2024-8-8 19:34
感谢楼主分享,正好拿去折磨我妹
windyhef 发表于 2024-8-8 19:59
有一个软件:一二年级口算题出题系统,好些年以前我就用过,给自己孩子磨炼用。如果有意义的话,楼主可以参考。
HumSunTT 发表于 2024-8-8 20:37
哈哈哈,小学生噩梦
hhbob23 发表于 2024-8-8 20:45
156608225 发表于 2024-8-8 19:13
要答案作甚,你还一个个去改啊,现在都是手机扫一下就改好了,夸克浏览器啥的好多都有这个

手写的答案也能识别吗?书写不是很标准
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 07:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表