好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 156608225 于 2024-8-8 19:04 编辑
上次发了《小学一年级100以内加减法生成(两位数加减一位数或整十数)》
https://www.52pojie.cn/thread-1932954-1-1.html
有善良的家长提出需要两位数加减的,用以提高孩子的曲率从而达到超光速的效果,共勉!
现推出【100以内两位加减法·小达人版】,帮助家长们度过一个愉快的假期。
* 每次打开随机100道题(鼠标点击单个算式可单独刷新该题)
* 同样100道题刚好一张A4纸打印
* 打印多张可以用记事本修改源码里的 let page_num = 1; // 页数
[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>
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|