一道看似简单实则困难的数学题的Scratch编程解法
一道看似简单实则困难的数学题的Scratch编程解法
题目是这样的:将一个正整数的个位放到首位,变成原来的2倍,求满足条件的最小正整数。
题目的意思很简单,小学生都能读懂,比如原数为357,将个位7放到首位,就变成735。很显然,735并不等于357的2倍(714),所以357不符合要求。我们容易验证所有的一位数和二位数都不符合要求。怎么求呢?
(一)算法分析
难点在于我们不确定它是几位数,难道只能从3位数开始,从小到大逐一穷举验证?那工作量可就太大了!要解决这个难题,运用数学知识(算法)筛选,缩小范围,就显得尤其重要。
我们先从验证二位数开始,看符合条件的数具有什么特殊性。
假如这个数是两位数X=ab,即个位是b,十位是a(X=10a+b),要满足题目条件,则有ba=2ab,即10b+a=2(10a+b),进而19a=8b,这里a和b都是非0的一位数,很显然无论b是1,2,…,9中的哪一个,8b都不是19的倍数,所以满足条件的a,b不存在。
将上述比较方法推广到n位数,这里n≥3。假设这个数为:
(二)编程实现
1.首先建立一个计算方幂的子程序:
2.建立一个找出最小n值得子程序:
3.根据找出的最小n值,求出Y值,建立将b从小到大验证符合条件的最小数。
由于Scratch内置的计算程序的精度有限,我们使用了自定义的大数乘法子程序和字符串处理,大数乘法子积木很繁杂,不展示直接用。
3.结果显示: